Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ std::是否需要任何_来遵循短路逻辑?_C++_C++11_Stl_Language Lawyer - Fatal编程技术网

C++ std::是否需要任何_来遵循短路逻辑?

C++ std::是否需要任何_来遵循短路逻辑?,c++,c++11,stl,language-lawyer,C++,C++11,Stl,Language Lawyer,给定以下代码 std::vector<int> numbers = {1, 2, 3, 4, 5}; std::any_of(std::begin(numbers), std::end(numbers), [](int number) { return number > 3; } ); std::向量数={1,2,3,4,5}; std::任意(std::开始(数字),std::结束(数字), [](整数){返回数>3;}); std::是否要求(

给定以下代码

std::vector<int> numbers = {1, 2, 3, 4, 5};
std::any_of(std::begin(numbers), std::end(numbers), 
            [](int number) { return number > 3; } );
std::向量数={1,2,3,4,5};
std::任意(std::开始(数字),std::结束(数字),
[](整数){返回数>3;});

std::是否要求(标准)任何单位在达到4时立即返回?

标准本身没有提出任何这样的硬要求。但可以推断,这是间接鼓励的():

模板
bool任意_of(inputierator first,inputierator last,pred谓词);
模板
bool(ExecutionPolicy&&exec、ForwardIterator first、ForwardIterator last、,
谓词pred);
返回:如果[first,last]为空,或者[first,last]范围内没有迭代器i,因此pred(*i)为true,则返回false;如果[first,last]范围内没有迭代器i,则返回true 否则

复杂性:至多是谓词的最后一个应用程序

虽然完全一致的实现可能会将谓词精确地应用于
last first
次,但在我看来,这样的措辞似乎会鼓励它尽快退出

请注意,实际上不可能对接受
执行策略的重载执行相同的请求。因为此时不知道求值顺序


在一个不太正式的注释中,任何在谓词为真时不退出的顺序版本的实现都会对其作者的凭据产生疑问。

也就是说:很明显,它应该在知道决策后立即返回,但必须返回吗?尽管如此,我真的不明白为什么需要问这样的问题,而不仅仅是重复虽然这在概念上类似于对所有元素的谓词结果进行ORing,但在大多数情况下,它可能不会使用
操作符|
展开到单个语句中,因此我认为这并不能真正表明短路是否会以任何方式发生……尽管常识确实如此@下面是我不相信的。在我写作的时候,单一的答案似乎排除了C++标准库对排序容器有潜在的优化,否则将使用O(log n)。类型方法。它仍然可以,但它必须沿着容器向后追踪,以找出满足条件的第一个元素。正是这种细节使这个问题成为一个非常好的问题。对于投票结束这个问题的人来说,主要是基于意见的:什么?标准不应该强制要求确切的顺序和计数因为它可能会排除依赖于容器和谓词类型的优化。例如,
任何(begin(intSet)、end(intSet)、[](inti){return i>500&&i<1000;})
可以转换为涉及
intSet.upper_-bound(500)
的内容,或者容器(部分)是连续,编译器生成SIMD。或者,容器元素可以以不同的顺序更有效地访问。如果谓词没有副作用,所有这些都将在“假设”规则下工作。让我感兴趣的是,
[alg.any_]
在“非修改序列操作”部分
[alg.nonmodifying]
但没有任何东西禁止非纯谓词:
任何(begin(numbers),end(numbers),[](int&number){return--number>2;})
.gcc&clang实现在到达范围的末尾之前确实会停止。@YSC-它们在该部分中,因为它们只接受一个谓词。违反shall not要求通常只是UB的承诺。@YSC-让我困惑的是,
std::for_each
也在那里。因为它不局限于接受一个简单的predicate@YSC-事实上,你和我都有误解。该部分被称为“非修改”,因为所有的算法都能正常工作。“修改”部分有生成输出范围的算法(通过otuput迭代器)。
template <class InputIterator, class Predicate>
  bool any_of(InputIterator first, InputIterator last, Predicate pred);
template <class ExecutionPolicy, class ForwardIterator, class Predicate>
  bool any_of(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last,
              Predicate pred);