Jon*_*Mee 14 c++ algorithm find c++11
C++ 11引入any_of了algorithms.
这似乎完全一样find_if.
说我有一个仿函数:function<bool(int)> foo;
和一个数组:vector<int> bar;
看起来这两个调用完全相同:
any_of(bar.begin(), bar.end(), foo);
Run Code Online (Sandbox Code Playgroud)
和
bar.end() != find_if(bar.begin(), bar.end(), foo);
Run Code Online (Sandbox Code Playgroud)
我进一步感到all_of,并且none_of可以通过否定find_if陈述来完成.
这些算法只是在这里end为我们做比较,还是有用我不明白?
Jon*_*ely 17
我相信你是对的,它们只是更方便的功能接口,可以通过其他方式实现.
将它们添加到标准(N2666)的建议说:
这三种算法提供普通的数学运算∀,∃和∄:给定范围和谓词,确定该谓词对于所有元素是否为真; 是否存在谓词为真的元素; 或者是否存在谓词为真的元素.严格来说,没有必要提供所有这三种算法(
!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);
请注意两种算法的返回类型.就像binary_search只返回如果提供的元素可以在排序的序列中找到,同时lower_bound将迭代器返回到不小于提供的元素的第一个元素,any_of并find_if相互补充.注意binary_search(差不多)是相同的!(val < lower_bound(a.begin(), a.end(), val))
any_of只会告诉你,如果该断言有效,对于任何元素,而find_if会返回一个迭代器,使断言成为真正的元素.另请注意,将find_if保留对使谓词变为true 的第一个元素的迭代器的保证,any_of而不具有此类限制.因此在理论上在某些情况下any_of可以更有效率.