不能写拉链范围?

时间:2019-02-25 03:03:25

标签: c++ c++14 range-v3

以下失败:

#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

c语

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

假设这是设计使然,为什么?

而且,我该如何使用范围来做这些显而易见的事情?

1 个答案:

答案 0 :(得分:1)

  1. copy接受输出 iterator ,而不接受输出 range 。因此,您需要在zip视图上调用begin并将其变成迭代器。
  2. 修复该问题后,您将遇到一个单独的问题。 zip平移两个范围会产生一个pair(好吧,一个common_pair),但是虽然两个元素的元组可以从对分配,但是对不能从两个元素的元组分配。结果,我们无法完成*zip_iterator = *data.begin()的等效操作,并且概念检查失败。如果将data设为pair s的向量,则它将起作用。