📜  排序向量 c++ (1)

📅  最后修改于: 2023-12-03 15:39:49.782000             🧑  作者: Mango

排序向量 C++

排序向量是一种常用的数据结构,它继承自向量,以及具有自动排序的特性。在 C++ 中,我们可以通过使用 STL 中的 std::sort 或者自定义比较函数来对排序向量进行排序。

简介

排序向量实现了自动排序的功能,即当我们插入一个新元素时,该元素会自动被放入合适的位置,以保证整个向量始终为有序状态。如下是一个基本实现的代码:

template<typename T>
class SortedVector : public std::vector<T> {
public:
    void insert(const T& value) {
        auto pos = std::lower_bound(this->begin(), this->end(), value);
        std::vector<T>::insert(pos, value);
    }
};

在上述代码中,我们使用了 STL 中的 std::lower_bound 函数来查找插入位置。该函数会在已排序的向量中查找第一个不小于给定值的元素,并返回其位置。然后使用 std::vector<T>::insert 将元素插入到该位置。

除了 insert 函数以外,我们还可以定义其他常用的成员函数,如 eraseat 等。可以参考标准 STL 的容器接口进行实现。

使用

使用排序向量非常简单,只需先定义一个对象,然后插入元素即可。例如:

SortedVector<int> vec;
vec.insert(1);
vec.insert(3);
vec.insert(2);

for (auto v : vec) {
    std::cout << v << " ";
}
// Output: 1 2 3

可以看到,排序向量始终保持有序状态。

自定义比较函数

排序向量中的元素类型不一定支持 < 运算符。在这种情况下,我们可以为排序向量定义一个自定义比较函数,来代替 < 运算符。例如:

struct Person {
    std::string name;
    int age;

    bool operator<(const Person& other) const {
        return age < other.age;
    }
};

struct ComparePerson 
{
    bool operator()(const Person& lhs, const Person& rhs) const {
        return lhs.age < rhs.age;
    }
};

SortedVector<Person, ComparePerson> vec;

在上述示例中,我们为 Person 结构体定义了 < 运算符,以便在使用 STL 的 std::sort 函数时进行排序。另外,我们还定义了一个切比雪夫距离作为排序的相似度度量。这样,在使用 insert 函数时就可以使用 ComparePerson 这个比较函数对象来代替 < 运算符了。

总结

排序向量是一个十分实用的数据结构,它实现了自动排序的功能,同时还可以使用 STL 中的排序函数进行排序。利用自定义比较函数可以更加灵活地进行排序,满足不同需求。