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。