📅  最后修改于: 2023-12-03 14:51:15.347000             🧑  作者: Mango
在C++中,std::vector
是一个非常常用的容器,它可以快速地存储一系列数据。在某些场景下,我们可能需要对这些数据进行排序。
当然,C++标准库提供了一些排序的函数,例如std::sort
。但是,std::sort
只能进行递增排序。如果我们想对一个非递增向量进行排序,该怎么办呢?
这时,std::vector
的reverse_iterator
就发挥了重要的作用。我们可以通过std::vector
的rbegin
和rend
函数获得它的反向迭代器,并使用std::sort
进行排序。在排序后,我们可以再使用reverse_iterator
将它们还原。
std::vector<int> v {4, 2, 5, 1, 3};
std::sort(v.rbegin(), v.rend());
for (const auto& i : v) {
std::cout << i << " ";
}
// 输出:5 4 3 2 1
在得到一个已经排序的非递增向量后,我们可能需要查找其中某个值的位置,这时可以使用std::upper_bound
和std::lower_bound
函数。
std::lower_bound
会返回第一个>=
目标值的迭代器,而std::upper_bound
会返回第一个>
目标值的迭代器。
下面是使用std::lower_bound
和std::upper_bound
进行查找的示例代码:
std::vector<int> v {5, 4, 3, 2, 1};
auto lb = std::lower_bound(v.rbegin(), v.rend(), 3); // 返回迭代器指向数字3
auto ub = std::upper_bound(v.rbegin(), v.rend(), 3); // 返回迭代器指向数字2
std::cout << *lb << " " << *ub << "\n"; // 输出:3 2
注意,由于std::vector
已经反向了,因此在调用std::lower_bound
和std::upper_bound
函数时,需要将迭代器参数倒序传递。