查找严格小于向量中按键的第一个元素按降序排序

时间:2017-05-25 11:31:07

标签: c++ algorithm vector stl

据我所知,可以使用find_if()STL-Algorithm函数完成此任务,如下所示:

long long int k; //k = key
scanf("%lld",&k);
auto it = find_if(begin(v),end(v),[k](auto e){return e<k;});

但是我要求在对数时间内获得结果。由于向量已经按降序排序,我想使用二进制搜索方法。

我理解STL算法函数lower_boundupper_bound保证了对数的复杂性。但是,我无法弄清楚如何使用这些函数来获得小于键的第一个元素,而不是大于或等于键的第一个元素。

例如:

假设我的矢量内容是:21 9 8 7 6 4

我的关键是:10

我希望输出为9,因为它是向量从左到右扫描的第一个元素,小于10

这方面的任何帮助都会非常有用!

由于

1 个答案:

答案 0 :(得分:10)

您可以将标准算法std::upper_bound与功能对象std::greater一起使用。

这是一个如何完成的例子。

#include <iostream>
#include <iterator>
#include <functional>
#include <algorithm>

int main()
{
    int a[] = { 21, 9, 8, 7, 6, 4 };
    int key = 10;

    auto it = std::upper_bound(std::begin(a), std::end(a),
        key, std::greater<int>());

    if (it != std::end(a)) std::cout << *it << std::endl;
}

程序输出

9