像lower_bound()这样的算法,但是另一个算法

时间:2016-01-06 13:05:02

标签: c++ algorithm

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<>之类的其他谓词不起作用。

2 个答案:

答案 0 :(得分:3)

只需在代码中使用谓词,但使用namerbegin

以相反的顺序遍历它

答案 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