C++ 任何与查找相关的
C++11在C++ 任何与查找相关的,c++,algorithm,c++11,find,C++,Algorithm,C++11,Find,C++11在算法中引入了任意 这似乎与find\u if完全一样 假设我有一个函子:函数foo 和一个数组:向量条 这两个电话似乎做了完全相同的事情: any_of(bar.begin(), bar.end(), foo); 及 我进一步认为,否定find\u if语句可以实现all\u的,none\u的 这些算法只是为了给我们做end的比较,还是我不明白它们有什么用处?请注意这两种算法的返回类型。就像binary\u search仅当所提供的元素可以在排序序列中找到时返回,而lower\u
算法中引入了任意
这似乎与find\u if
完全一样
假设我有一个函子:函数foo代码>
和一个数组:向量条代码>
这两个电话似乎做了完全相同的事情:
any_of(bar.begin(), bar.end(), foo);
及
我进一步认为,否定find\u if
语句可以实现all\u的,none\u的
这些算法只是为了给我们做end
的比较,还是我不明白它们有什么用处?请注意这两种算法的返回类型。就像binary\u search
仅当所提供的元素可以在排序序列中找到时返回,而lower\u bound
将迭代器返回到不小于所提供元素的第一个元素,中的任何和find\u if
相互补充。请注意,binary\u search
与几乎相同!(val<下限(a.begin(),a.end(),val))
any\u of
只会告诉您谓词是否适用于任何元素,而find\u if
将向元素返回一个迭代器,使谓词变为真。还要注意,find\u if
保证返回使谓词变为true的第一个元素的迭代器,而中的任何\u都没有这样的限制。因此,在理论上,在某些情况下,的任何一个
都可能更有效 我相信你是对的,它们只是更方便的接口,可以通过其他方式实现功能
建议将其添加到标准()中,内容如下:
这三种算法提供了普通的数学运算∀, ∃, 及∄: 给予
范围和谓词,确定该谓词对于所有元素是否为真;是否
存在谓词为true的元素;或者是否不存在任何元素
谓词为真的。严格地说,没有必要提供所有这三项服务
这些算法(!无
和任何
的算法都是等效的),但这三种操作都是等效的
感觉同样重要
<> >名称比自然语言更自然,更容易阅读(当然,对于非专家C++程序员)比包含代码< FordIn,如果< /代码>和(in)相等的表达式更容易阅读。
GCC的标准库只需调用其他函数即可实现这些功能:
all_of(first,last,pred)
isreturn last==std::find_if_not(first,last,pred)代码>
none_of(first,last,pred)
isreturn last==std::find_if(first,last,pred)代码>
任何(第一个、最后一个、pred)
都是返回!无(第一、最后、pred)
我认为你没有真正解决核心问题,任何一个只是查找if(:)!=end()
?你用最后一句关于效率的话谈到了这个问题,但我认为这不应该只是一句简单的评论。@remyabel我认为这句话只是说,“任何一个都可以更有效。”也就是说,没有必要在any\u of
中维护或返回迭代器,因此如果有比线性比较每个元素更快的算法,可以用于any\u of
@Angew,这就是您的观点。我对这个问题没有明确的答案,这就是为什么我提出了几种可能的解释:1)为了一致性(标准中还有其他类似的例子)2)为了效率(任何一种都可能更有效)3)易用性-any\u if
是布尔值,而find\u if
不是布尔值,如果我们只关心是否存在与谓词匹配的元素,我们可以使用any\u of
。我不同意其中效率是最重要的,而且我怀疑,如果搜索在多个核心上并行执行,那么任何一个的的普通实现是否真的更有效,效率是否真的可以提高。GCC的库实现了对last==find\u if\u not/last==find\u if/的all\u of/none\u of/any\u of as调用!没有respectively@JonathanWakely你能把它写进一个答案吗?我愿意接受这一点。
bar.end() != find_if(bar.begin(), bar.end(), foo);