gpt4 book ai didi

c++ - 我可以将 std::transform 与并行执行策略一起使用吗?

转载 作者:行者123 更新时间:2023-12-02 01:25:27 28 4
gpt4 key购买 nike

如果我没记错的话,我可以通过使用与输入和输出迭代器相同的范围来使std::transform执行就地。假设我有一些 std::vector 对象 vec,那么我会写

std::transform(vec.cbegin(),vec.cend(),vec.begin(),unary_op)

使用合适的一元运算unary_op

使用 C++17 标准,我想通过将 std::execution::par 作为第一个参数粘贴到其中来并行执行转换。这将使函数在 cppreference article on std::transform 中从重载 (1) 变为 (2)。 。然而,对这种重载的评论说:

unary_op [...] must not invalidate any iterators, including the end iterators, or modify any elements of the ranges involved. (since C++11)

“修改任何元素”是否真的意味着我无法就地使用算法,或者这是在谈论我误解的不同细节?

最佳答案

我相信它谈论的是不同的细节。 unary_op 获取序列中的一个元素并返回一个值。该值被存储(通过transform)到目标序列中。

所以这个unary_op就可以了:

int times2(int v) { return 2*v; }

但这个不会:

int times2(int &v) { return v*=2; }

但这并不是您真正要问的。您想知道是否可以使用 unary_op 版本的 transform 作为具有相同源和目标范围的并行算法。我不明白为什么不。 transform 将源序列的单个元素映射到目标序列的单个元素。但是,如果您的 unary_op 并不是真正的一元(即,它引用序列中的其他元素 - 即使它只读取它们,那么您也会遇到数据竞争)。

关于c++ - 我可以将 std::transform 与并行执行策略一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58260335/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com