首页 > 解决方案 > 具有相反顺序的集合上的 std::lower_bound

问题描述

假设我有一个std::set<int>并且我想以lower_bound(x)两种方式执行操作。那是,

使用std::vector,我可以使用一个排序的vector

std::vector<int> v({1,2,3, 5,6});
sort(v.begin(), v.end());
auto a = std::lower_bound(v.begin(), v.end(), 4); // gives 5
auto b = std::lower_bound(v.rbegin(), v.rend(), 4, greater<int>()); // gives 3

我可以用 做类似的事情,还是必须使用相同的值但使用反向比较器std::set来维护一个附加值?set

标签: c++set

解决方案


我可以做类似的事情吗std::set

是的,std::set<int>总是std::less<int>有序的,它的反向迭代器是std::greater<int>有序的。

std::set<int> v({1,2,3, 5,6});
auto a = std::lower_bound(v.begin(), v.end(), 4); // 5
auto b = std::lower_bound(v.rbegin(), v.rend(), 4, std::greater<int>()); // 3

如果你的集合有一个自定义比较器,你可以做类似的事情

template<typename Compare>
class reverse_compare {
    Compare comp;
    bool operator()(auto lhs, auto rhs) {
        return comp(rhs, lhs);
    }
}

推荐阅读