最近的项目中标准库函数的使用比较频繁,最开始看别人的博客,总感觉很多博文都停留在套用层次,我是一个比较爱深究的人,闲暇之余查阅了很多文档。终于找到了满足我好奇心的解释。实际上像std::find_if() std::for_each() 这样的函数就是简单的for循环,为了让我们少些代码而已^_^。又说了一大堆废话,好切入主题让我们一起揭开std::find_if() 神秘面纱。
它的定义大致这样的:
template<class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate p)
{
//迭代容器对结果进行判定操作
for (;first != last; ++first) {
if (true == p(*first)) {
return first;
}
}
return last;
}最关键的是p它是一个可调用对象,用这个传入的委托可以处理判定逻辑,从而返回符合条件的第一个元素迭代器。
二、既然p是可调用对象,那我们可以这样定义p:
///[method 1]
bool fun1(int a)
{
if (a < 30) {
return true;
} else {
return false;
}
}
///[method 2]
struct Fun2
{
public:
bool operator()(int a)
{
if (a < 80) {
return true;
} else {
return false;
}
}
};
///[method 3] 这种方式要求使用c++11,为了集中表达三种方式定义成了全局的,实际可做实参传入
auto fun3 = [] (int a) ->bool {
if (a < 10) {
return true;
} else {
return false;
}
};
三、举个例子验证一把:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<int> l = {78, 87, 27, 90, 45, 6};
qDebug() << "*******使用全局函数**********";
auto iterator_ = std::find_if(l.begin(), l.end(), fun1);
qDebug() << (*iterator_);
qDebug() << "*******使用重载()**********";//
auto it2 = std::find_if(l.begin(), l.end(), Fun2());
qDebug() << (*it2);
qDebug() << "*******使用lambda表达式**********";//
QList<int>::Iterator it3 = find_if(l.begin(), l.end(),fun3);
qDebug() << (*it3);
return a.exec();
}