Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 任何与查找相关的_C++_Algorithm_C++11_Find - Fatal编程技术网

C++ 任何与查找相关的

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

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 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)
is
return last==std::find_if_not(first,last,pred)

none_of(first,last,pred)
is
return 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);