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_of
和none_of
可以通过否定find_if
声明来完成。
这些算法是否只是为了我们与end
进行比较,还是有用我不明白?
答案 0 :(得分:17)
我相信你是对的,他们只是更方便的功能接口,可以通过其他方式实现。
将其添加到标准(N2666)的建议说:
这三种算法提供普通的数学运算∀,∃和∄:给定a range和谓词,确定该谓词是否适用于所有元素;是否 存在谓词为真的元素;或者是否没有元素 谓词是真的。严格来说,没有必要提供全部三个 这些算法(
!none_of
和any_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
可以更有效。