find_if的两个条件

时间:2013-07-17 21:07:08

标签: algorithm c++11 vector c++

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

v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

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

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

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

2 个答案:

答案 0 :(得分:6)

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

进行排序
auto it = std::lower_bound(v.begin(), v.end(), 8); // first value >= 8
auto m = *((it != v.begin())? --it : it);         

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

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

如果您无法修改矢量,则可以手动执行

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

两种最终方法都具有线性复杂性。后者可以通过使用filter_iterator库中的Boost.Iterator来推广,但是你已经深入到模板领域,所以只有在你重复需要这种魔法时才能这样做。

答案 1 :(得分:0)

我会创建一个函数来检查向量中是否存在任何值,如果不是,则会抛出错误。然后我会保存每个低于遇到的最大值但高于当前找到的最高值。这就是我实现它的方式。

unsigned smaller_than ( const std::vector<unsigned int>& v, unsigned max) {

    bool intial_found = false;
    unsigned largest;
    unsigned i;
    for ( i = 0; i < v.size() ;++i){
        if ( v [i] < max ){
            largest = v[i];
            intial_found = true;
            break;
        }
    }
    if ( ! intial_found ) {
        throw "oops";/*of course you make a Nice std::exception for this case*/
    }
    for (  ; i < v.size(); i++ ) {
        if ( v[i] < max && v [i] > largest){
            largest = v[i];
        }
    }
    return largest;
}