📅  最后修改于: 2023-12-03 15:39:49.782000             🧑  作者: Mango
排序向量是一种常用的数据结构,它继承自向量,以及具有自动排序的特性。在 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
函数以外,我们还可以定义其他常用的成员函数,如 erase
、at
等。可以参考标准 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 中的排序函数进行排序。利用自定义比较函数可以更加灵活地进行排序,满足不同需求。