使用std :: find_if和std :: vector来查找大于某个值的最小元素

时间:2017-12-03 14:57:33

标签: c++ c++11 vector lambda

我有一个有序的双打矢量。

std::vector<double> vec;
for(double x{0.0}; x < 10.0 + 0.5; x += 1.0) vec.push_back(x);

我正在尝试使用std::find_if来查找此向量的第一个元素及其相应的索引y < elementy的价值在哪里。

例如,如果y = 5.5,则相关元素是元素6.0,其索引为6,并且是第7个元素。

我怀疑可以使用lambda函数。

  • 可以使用lambda函数来执行此操作吗?

  • 如果是这样,我如何实施find_if声明来做我想做的事?

4 个答案:

答案 0 :(得分:2)

如果使用lambda函数,则需要1行代码:x是本地double(我们正在搜索的值)const double x = 5.5

std::find_if(vec.cbegin(), vec.cend(), [x] (double element) { return (x < element); })

打破这种局面,我们有:

std::find_if(vec.cbegin(), vec.cend(), lambda)

lambda是:

[x] (double element) { return (x < element); }

这意味着:

  • 捕获局部变量x以在lambda body中使用
  • lambda函数将一个double作为参数(算法find_if将传递每个元素,因为它在向量上迭代到此函数element
  • 当找到x < element
  • 的第一个元素时,函数体返回true

注意:我在研究可能的解决方案时自己回答了这个问题。我在自己的程序中使用它的上下文略有不同。在我的上下文中,向量是数值边界的规范,我希望找到lower < x < higher。因此我使用的代码与此略有不同,因为我必须将返回的迭代器移动1个位置,因为指定了数字边界。如果我在转录解决方案时引入了一个错误,请告诉我。

答案 1 :(得分:2)

只需使用std::upper_bound() - 它更有效(它使用二进制搜索)并且不需要lambda:

auto it = std::upper_bound( vec.begin(), vec.end(), x );

如果您需要查找lower < x < upper,可以使用std::equal_range(),但是您需要其他逻辑才能找到合适的lower,因为std::lower_bound会给出小于或等于x,因此您需要确保lower小于x且不相等。

live example

答案 2 :(得分:1)

看起来你还没有被介绍过std::upper_bound

std::upper_bound(vec.begin(), vec.end(), x);

答案 3 :(得分:-1)

如果您需要索引,可以添加一个计数器。

这样的东西
x = 5;

cnt = -1;

std::find_if(vec.cbegin(), vec.cend(),
   [&] (double element) { ++cnt; return (x < element); })