c++ - 具有相反顺序的集合上的 std::lower_bound
问题描述
假设我有一个std::set<int>
并且我想以lower_bound(x)
两种方式执行操作。那是,
- 获取大于或等于的第一个元素
x
- 获取小于或等于的最后一个元素
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
解决方案
我可以做类似的事情吗
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);
}
}
推荐阅读
- laravel - 在 Livewire 中单击之前如何防止使用参数
- c - c时钟()在不同的操作系统
- r - 如何删除包含某些文本的 tibble 行?
- apache-flink - Flink:使用 CSV 文件的事件时间聚合
- flutter - 单击单选按钮时如何更改容器
- python - 即使在执行程序后,Postgresql 数据库上的连接仍处于活动状态
- cypress - 赛普拉斯:如何通过检查 URL 有条件地跳过测试
- java - 解决两个插件之间的循环依赖问题
- functional-programming - 带有可选递归组件的 F# 可区分联合
- javascript - 如何连续单击按钮以显示javascript中的下一个元素