find_if的两个条件

Shi*_*bli 3 c++ algorithm vector c++11

在a中std::vector<unsigned int>,我想找到元素的位置,该位置是小于某个数字的最大数.例如:

v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Run Code Online (Sandbox Code Playgroud)

我想找一个小于8的最大数字.这个数字是7.

以下代码不正确,但这可能是我想要的.

std::vector<unsigned int>::iterator pnt = std::find_if (v.begin(), v.end(), [](const unsigned int& x) { return x < 8; && x == MAX; });
Run Code Online (Sandbox Code Playgroud)

Tem*_*Rex 6

如果您的向量始终排序,那么您可以以对数复杂度进行排序

auto it = std::lower_bound(v.begin(), v.end(), 8); // first value >= 8
auto m = *((it != v.begin())? --it : it);         
Run Code Online (Sandbox Code Playgroud)

如果您的矢量未分类但可以修改,则可以分两步完成:

auto it = std::partition(v.begin(), v.end(), [](int x) { x < 8 });
auto m = *(it != v.begin())? std::max_element(v.begin(), it) : it);
Run Code Online (Sandbox Code Playgroud)

如果您无法修改矢量,则可以手动完成

auto max = 0;
for (elem: v) {
   if (elem < 8) 
       m = std::max(elem, m);
}
// m is now the max of all elements < 8
Run Code Online (Sandbox Code Playgroud)

两种最终方法都具有线性复杂性.后者可以通过使用一概而论filter_iteratorBoost.Iterator库,但那么你已经深入到模板的土地,所以只有这样做,如果你有反复需要这样的魔力.