![](/img/trans.png)
[英]std::vector and std::list find_if and max_element performance
[英]Using std::find_if with std::vector to find smallest element greater than some value
我有一个有序的双打向量。
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 < element
。 y
是一些值。
例如,如果y = 5.5
则相关元素是元素6.0
,索引为6
,是第7个元素。
我怀疑可以使用lambda函数来做到这一点。
可以使用lambda函数执行此操作吗?
如果是这样,我如何实现find_if
语句来执行我想要的操作?
如果使用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体内使用 double
find_if
作为参数(算法find_if
将在对向量进行迭代时将每个元素传递给此函数作为element
) x < element
时,函数主体返回true 注意:我在研究可能的解决方案时亲自回答了这个问题。 我在自己的程序中使用此上下文的环境略有不同。 在我的上下文中,向量是数字边界的规范,我正在寻找lower < x < higher
。 因此,我使用的代码与此稍有不同,因为由于如何指定数字边界,我不得不将返回的迭代器移位1位。 如果我在转录解决方案时引入了一个错误,请告诉我。
只需使用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
且不相等。
看来您尚未被引入std::upper_bound
:
std::upper_bound(vec.begin(), vec.end(), x);
如果需要索引,可以添加一个计数器。
就像是
x = 5;
cnt = -1;
std::find_if(vec.cbegin(), vec.cend(),
[&] (double element) { ++cnt; return (x < element); })
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.