any_of对比find_if

Jon*_*Mee 14 c++ algorithm find c++11

C++ 11引入any_ofalgorithms.

这似乎完全一样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);


izo*_*ica 8

请注意两种算法的返回类型.就像binary_search只返回如果提供的元素可以在排序的序列中找到,同时lower_bound将迭代器返回到不小于提供的元素的第一个元素,any_offind_if相互补充.注意binary_search(差不多)是相同的!(val < lower_bound(a.begin(), a.end(), val))

any_of只会告诉你,如果该断言有效,对于任何元素,而find_if会返回一个迭代器,使断言成为真正的元素.另请注意,将find_if保留对使谓词变为true 的第一个元素的迭代器的保证,any_of而不具有此类限制.因此在理论上在某些情况下any_of可以更有效率.

  • 我不认为你真的解决了核心问题 - "any_of"只是`find_if(:: :)!= end()`的简写?你用最后一句关于效率的话来谈论这个话题,但我认为这不仅仅是一个过时的评论. (3认同)
  • @Angew这是你的意见.我对这个问题没有明确的答案,这就是为什么我提出了几种可能的解释:1)为了保持一致性(标准中还有其他类似的例子)2)效率(任何**可以**更有效)3 )易用性 - `any_if`是布尔值,而`find_if`不是因为我们只关心匹配谓词的元素的存在,我们可以使用`any_of`.我不同意这些效率是最重要的,而且我更怀疑任何常见的实现对于'any_of`来说真的更有效率 (2认同)