可写的拉链范围是不可能的?(writable zip ranges are not possible

2019-09-30 02:19发布

以下是失败的:

#include <range/v3/view.hpp>
#include <range/v3/view/zip.hpp>
#include <range/v3/utility/iterator.hpp>

// ...

std::vector< std::tuple<int, std::string> > const data{
   {1,"a"},
   {2,"b"},
   {3,"c"}
};
std::vector<int> vi(data.size());
std::vector<std::string> vs(data.size());

using namespace ranges;
copy(data,  view::zip(vi,vs) ); // error

铛说

No matching function for call to object of type 'const 
ranges::v3::with_braced_init_args<ranges::v3::copy_fn>'

假设这是由设计,为什么呢?

而且,我该怎么做这个范围内显而易见的事情?

Answer 1:

  1. copy需要一个输出迭代 ,而不是一个输出范围 。 所以,你需要调用begin上的zip视图,把它变成一个迭代器。
  2. 与固定的,你遇到了一个单独的问题。 zip平两个范围产生一pair (井, common_pair ),但同时两个元素的元组是从对分配,对不可分配从两个元素的元组。 其结果是,我们不能这样做相当于*zip_iterator = *data.begin()这一概念检查失败。 如果您data的矢量pair S,那么它会工作。


文章来源: writable zip ranges are not possible?