当与顺序执行策略一起使用时,std :: any_of是否保证迭代顺序?

Asp*_*nca 7 c++ std

我有一个过滤器功能列表。如果这些函数中的任何一个返回“ true”,则不应进一步处理事件。

std :: any_of似乎适合此用例,但我想保证按其添加到我的列表的顺序调用过滤器函数(因为它们可能会产生副作用)。因此,如果我使用std :: any_of,我需要知道它调用过滤器函数的顺序是确定性的,从列表的begin()到end()。

我已经检查了std :: any_of上的C ++标准和顺序执行策略,但是没有提到顺序保证。我没有找到关于cppreference的顺序保证的提法,也没有在stackoverflow上找到足够类似的答案。

我的结论是,没有订单保证。尽管大多数编译器可能会按顺序处理这些函数,但我不应该依赖它。

bool MyClass::event(QEvent* event)
{
    std::vector<std::function<bool(QEvent*)> > functionList = getCurrentEventFilters();

    const auto bFilter = std::any_of(functionList .begin(),
                                     functionList .end(),
                                     [&event](std::function<bool(QEvent*)> function) {return function(event);});
    if (bFilter)
    {
        return true;
    }

    return Base::event(event);
}
Run Code Online (Sandbox Code Playgroud)

use*_*208 5

关于std::execution::sequenced_policy

用此策略(通常指定为std::execution::seq)调用的并行算法中元素访问函数的调用在调用线程中不确定地排序。

关于不定顺序

的评估AB被测序不定:他们可以以任意顺序进行,但可能不会重叠:要么A会前完成B,或B将是之前完成A

对我来说,这似乎是明确的声明,您不能依赖事物的顺序。
我没想到这个..

原则上,这对您来说并不重要。呼叫std::any_ofstd::all_of带有副作用的东西似乎令人怀疑。


Dan*_*ica 5

您询问顺序执行策略,但在未指定任何策略的情况下调用重载。这些可能有所不同,因为接受执行策略的重载要求ForwardIterator而另一个要求InputIteratorhttp : //eel.is/c++draft/alg.any.of

然后,标准在这里说:http : //eel.is/c++draft/algorithms.requirements#4.1

如果算法的模板参数名为InputIteratorInputIterator1InputIterator2,则模板参数应满足Cpp17InputIterator的要求。

这基本上意味着该实现只能增加输入迭代器,并且将按顺序处理范围。

相反,我不确定该实现是否会为某种其他类型的迭代器(例如随机访问的迭代器)提供其他算法版本。

一个相关的问题:为什么std :: transform不保证顺序(但是for_each保证顺序)?这不是为了技巧而实现的技巧吗?。那里的一条评论说:

该实现可以自由地检测更强的迭代器强度并应用其他算法(可能是乱序的)。

尽管有一些讨论。如果为true,则仅在迭代器为输入类型时才保证顺序。