C++ STL find和find_if

LZ在VINS-Mono中看源代码时,vins_estimator/src/feature_manager.cpp的addFeatureCheckParallax()查看视差判断是否为关键帧函数中,寻找featuer list中是否之前出现过当前特征点的feature_id,用到了find_if函数。

auto it = find_if(feature.begin(), feature.end(), [feature_id](const FeaturePerId &it)
                          {
            return it.feature_id == feature_id;
                          });

第三个参数是Lambda表达式,意为:遍历feature list 容器看看之前是否出现过当前的feature_id。


find则更偏向于普通的数值或者字符比较

find_if针对查找的对象中包含指针需要进行比较


首先从简单的find寻找某个数值开始,其返回的是指向这个数值的迭代器。

注意:需要加入#include <algorithm>头文件

#include <vector>
#include <algorithm>// 注意!!!
#include <iostream>
using namespace std;

int main( )
{
    vector<int> L;
    L.push_back( 1 );
    L.push_back( 2 );
    L.push_back( 3 );
    L.push_back( 4 );
    L.push_back( 5 );

    vector<int>::iterator result = find( L.begin( ), L.end( ), 3 ); //查找3
    if ( result == L.end( ) ) //没找到
        cout << "No" << endl;
    else //找到
        cout << "Yes" << endl;
}

如果找到了返回的是指向这个数值的迭代器,否则没找到返回的是L.end()。


假如vector包含一个复合类型的对象呢,通过find_if泛型算法

find_if (begin, end, func)

就是从begin开始 ,到end为止,返回第一个让 func这个函数返回true的iterator

这里的最后一个参数可是一个一元谓词,即只带一个参数且返回值限定为bool的函数对象

int value {5};
auto iter1 = std::find_if(std::begin(numbers), std::end(numbers),[value](int n) { return n > value; });

find_if() 的第三个参数是一个 lambda 表达式的谓词。这个 lambda 表达式以值的方式捕获 value,并在 lambda 参数大于 value 时返回 true。

发布了177 篇原创文章 · 获赞 84 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/try_again_later/article/details/104900911