any_of Vs find_if

时间:2014-12-11 15:09:20

标签: c++ algorithm c++11 find

C ++ 11将any_of引入algorithm s。

这似乎与find_if完全相同。

说我有一个仿函数:function<bool(int)> foo; 还有一个数组:vector<int> bar;

看起来这两个电话完全相同:

any_of(bar.begin(), bar.end(), foo);

bar.end() != find_if(bar.begin(), bar.end(), foo);

我进一步认为all_ofnone_of可以通过否定find_if声明来完成。

这些算法是否只是为了我们与end进行比较,还是有用我不明白?

2 个答案:

答案 0 :(得分:17)

我相信你是对的,他们只是更方便的功能接口,可以通过其他方式实现。

将其添加到标准(N2666)的建议说:

  

这三种算法提供普通的数学运算∀,∃和∄:给定a   range和谓词,确定该谓词是否适用于所有元素;是否   存在谓词为真的元素;或者是否没有元素   谓词是真的。严格来说,没有必要提供全部三个   这些算法(!none_ofany_of是等效的),但这三个操作都是等效的   同样重要。

与涉及find_if和(in)相等的表达式相比,名称更自然,更容易阅读(当然对非专业C ++程序员而言)。

GCC的标准库通过简单地调用其他函数来实现它们:

all_of(first, last, pred)return last == std::find_if_not(first, last, pred);

none_of(first, last, pred)return last == std::find_if(first, last, pred);

any_of(first, last, pred)return !none_of(first, last, pred);

答案 1 :(得分:7)

请注意两种算法的返回类型。就像binary_search只有在提供的元素可以在排序的序列中找到时才返回,而lower_bound返回第一个元素的迭代器不小于提供的元素any_of和{{1} } 相得益彰。请注意,find_if(几乎)与binary_search

相同

!(val < lower_bound(a.begin(), a.end(), val))只会告诉你 if 谓词是否适用于任何元素,而any_of将返回一个迭代器给使谓词变为true的元素。另请注意,find_if将保证返回第一个元素的迭代器,使得谓词变为true,而find_if没有此类限制。因此理论上在某些情况下any_of可以更有效。