以下是失败的:
#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>'
假设这是设计使然,为什么?
而且,我怎样才能用范围来做这个显而易见的事情?
最佳答案
copy
采用输出迭代器,而不是输出范围。因此,您需要在 zip View 上调用begin
并将其转换为迭代器。- 解决了这个问题后,您会遇到一个单独的问题。
zip
ping 两个范围产生一个pair
(好吧,一个common_pair
),但是当两个元素的元组可以从对中赋值时,对是不可赋值的来自两个元素的元组。因此,我们无法执行与*zip_iterator = *data.begin()
等效的操作,并且概念检查失败。如果您使data
成为pair
的 vector ,那么它就可以工作。
关于c++ - 可写的 zip 范围是不可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54858938/