并行 STL 是否处理插入迭代器,例如 std::back_insert_iterator?

Vik*_*ehr 5 c++ parallel-processing stl stl-algorithm c++17

并行 STL 算法是否符合std::back_insert_iterator??

我可能误解了std::par和之间的区别std::par_vec,是否std::par_vec意味着需要预先分配输出范围?

代码示例:

auto numbers = {1,2,3,4,5,6};
auto squared = std::vector<int>{};
std::transform(
  **std::par/std::par_vec,**
  numbers.begin(),
  numbers.end(),
  std::back_inserter(squared),
  [](auto val) { 
    return val*val; 
  }
);
Run Code Online (Sandbox Code Playgroud)

更新

简化问题作为我的第一个问题是误读文章的结果。

Ami*_*ory 4

并行 STL 算法是否符合 std::back_insert_iterator?

N4659规定 (28.6.4) 如下。

较旧的预执行策略重载std::transform,使用输入迭代器和输出迭代器。

template<class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform(InputIterator first, InputIterator last,
    OutputIterator result, UnaryOperation op);
Run Code Online (Sandbox Code Playgroud)

较新的重载使用执行策略,使用前向迭代器:

template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class UnaryOperation>
ForwardIterator2 transform(ExecutionPolicy&& exec,
    ForwardIterator1 first, ForwardIterator1 last,
    ForwardIterator2 result, UnaryOperation op);
Run Code Online (Sandbox Code Playgroud)

因此,您似乎无法使用back_insert_iterator新的重载,因为它不满足 前向迭代器概念要求。

std::par_vec 是否意味着需要预先分配输出范围?

std::par_vec指矢量化与并行化意义上的矢量化。它指定两者都可以使用。

  • 我相信这个答案是正确的。不过,我花了一些时间来解析这个措辞。我可以更好地理解你所说的内容,如下所示:虽然 C++17 之前版本的“transform”采用“back_insert_iterator”满足的“OutputIterator”,但新的“ExecutionPolicy”接受版本,如 N4659 所描述,采用一个 `ForwardIterator`,而 `back_insert_iterator` 不满足。 (2认同)