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

时间:2017-06-27 19:25:59

标签: c++ parallel-processing stl c++17 stl-algorithm

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

我可能误解了std::parstd::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; 
  }
);

更新

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

1 个答案:

答案 0 :(得分:3)

  

并行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);

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

template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class UnaryOperation>
ForwardIterator2 transform(ExecutionPolicy&& exec,
    ForwardIterator1 first, ForwardIterator1 last,
    ForwardIterator2 result, UnaryOperation op);

因此,似乎您不能将back_insert_iterator与新重载一起使用,因为它不符合forward iterators概念要求。

  

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

std::par_vec是指vectorization vs. parallelization意义上的矢量化。它指定两者都可以使用。