📌  相关文章
📜  在C++中非递增向量的upper_bound和lower_bound(1)

📅  最后修改于: 2023-12-03 14:51:15.347000             🧑  作者: Mango

在C++中非递增向量的upper_bound和lower_bound

在C++中,std::vector是一个非常常用的容器,它可以快速地存储一系列数据。在某些场景下,我们可能需要对这些数据进行排序。

当然,C++标准库提供了一些排序的函数,例如std::sort。但是,std::sort只能进行递增排序。如果我们想对一个非递增向量进行排序,该怎么办呢?

这时,std::vectorreverse_iterator就发挥了重要的作用。我们可以通过std::vectorrbeginrend函数获得它的反向迭代器,并使用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_boundstd::lower_bound函数。

std::lower_bound会返回第一个>=目标值的迭代器,而std::upper_bound会返回第一个>目标值的迭代器。

下面是使用std::lower_boundstd::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_boundstd::upper_bound函数时,需要将迭代器参数倒序传递。