簡體   English   中英

當與順序執行策略一起使用時,std :: any_of是否保證迭代的順序?

[英]Does std::any_of guarantee the order of iteration when used with sequencial execution policy?

我有一個過濾功能列表。 如果這些函數中的任何一個返回'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);
}

關於std::execution::sequenced_policy

使用此策略調用的並行算法中的元素訪問函數的調用(通常指定為std::execution::seq )在調用線程中不確定地排序。

關於不確定的順序

AB評估是不確定的:它們可以按任何順序進行,但可以不重疊: AB之前完成,或BA之前完成。

對我來說,這似乎是明確的陳述,你不能依賴於事物的順序。
我沒想到這個..

原則上它對你來說無關緊要。 在帶有副作用的東西上調用std::any_ofstd::all_of似乎很可疑。

您詢問順序執行策略,但調用沒有指定策略的重載。 這些可能不同,因為接受執行策略的重載需要ForwardIterator而另一個需要InputIteratorhttpInputIterator

標准然后在這里說: http//eel.is/c++draft/algorithms.requirements#4.1

如果算法的模板參數名為InputIteratorInputIterator1InputIterator2 ,則模板參數應滿足Cpp17InputIterator要求。

這基本上意味着實現可能只增加輸入迭代器,並且將按順序處理范圍。

相反,我不確定實現是否可能為某些其他類型的迭代器提供額外的算法版本,例如隨機訪問。

一個相關的問題: 為什么std :: transform不保證訂單(但for_each保證訂單)? 這是否允許針對性能的技巧實現? 其中一條評論說:

該實現可以自由地檢測更強的迭代器強度並應用不同的(可能是無序的)算法。

雖然有一些討論。 如果為true,則僅當迭代器是輸入類型時才保證順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM