c++ - 可写的 zip 范围是不可能的?

标签 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

clang 说

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

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

而且,我怎样才能用范围来做这个显而易见的事情?

最佳答案

  1. copy 采用输出迭代器,而不是输出范围。因此,您需要在 zip View 上调用 begin 并将其转换为迭代器。
  2. 解决了这个问题后,您会遇到一个单独的问题。 zipping 两个范围产生一个pair(好吧,一个common_pair),但是当两个元素的元组可以从对中赋值时,对是不可赋值的来自两个元素的元组。因此,我们无法执行与 *zip_iterator = *data.begin() 等效的操作,并且概念检查失败。如果您使 data 成为 pair 的 vector ,那么它就可以工作。

关于c++ - 可写的 zip 范围是不可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54858938/

相关文章:

c++ - 从 2D vector 中的每一行添加最大元素,使得行元素 $A_i$ 小于 $A_(i+1)$

c++ - Qt,运行缓慢时不卡住GUI输入元素

c++ - 推断函数模板参数的确切类型

c++ - 在 C++ 和 range-v3 中,如何将空格分隔的数字字符串转换为整数 vector ?

c++ - ifstream.eof() 在 C++ 中未评估为真

c++ - 矩阵的行、列和对角线之和

c++ - 具有用户定义的字符串文字的底层字符数据的存储持续时间

c++按值传递模板化unique_ptr

c++ - range的递归函数(from range-v3)导致编译发散: why?

c++ - 作为数据成员的范围 View