有upper_bound()
,返回第一个元素的迭代器,该元素大于而不是val。
有lower_bound()
,返回第一个元素的迭代器,不小于而不是val。
是否有算法将迭代器返回到不大于的第一个元素,或者我必须重新发明轮子?
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::vector<int> data = { 1, 1, 2, 3, 3, 3, 3, 5, 5, 6 };
auto lower = std::lower_bound(data.begin(), data.end(), 4, [](int x, int y) {return x > y;});
cout << *lower ;
}
输出:1,被驱逐3
请注意,std::greater<>
之类的其他谓词不起作用。
答案 0 :(得分:3)
只需在代码中使用谓词,但使用name
和rbegin
答案 1 :(得分:1)
我的两位,你忘了按降序排序。
int main()
{
vector<int> data = { 1, 1, 2, 3, 3, 3, 3, 5, 5, 6 };
int wanted {4};
sort(begin(data), end(data), greater<int>());
auto bound = upper_bound(begin(data), end(data), wanted, greater<int>());
cout << "val with upper_bound: " << *bound << endl;
}
result: val with upper_bound: 3
使用partition_point 或下面的一步:
template <typename T>
struct greater_than {
T x;
bool operator()(const T& y) { return y > x; }
};
int main()
{
...
auto p_point = partition_point(begin(data), end(data),
greater_than<int>{wanted});
cout << "val with partition_point: " << *p_point << endl;
// val with partition_point: 3