我有一个带有这个签名的第三方函数:
std::vector<T> f(T t);
我还有一个名为 src
的 T
的现有潜在无限范围 ( of the range-v3 sort)。我想创建一个管道,将 f
映射到该范围内的所有元素,并将所有 vector 及其所有元素展平到一个范围内。
出于本能,我会写下以下内容。
auto rng = src | view::transform(f) | view::join;
但是,这个不会工作 以前没有工作,因为我们不能不能创建临时容器的 View 。
UPDATE: This issue has been patched通过 this commit .
range-v3 如何支持这样的范围管道?
最佳答案
看起来像there are now test cases in the range-v3 library显示如何正确执行此操作。有必要将 views::cache1
运算符添加到管道中:
auto rng = views::iota(0,4)
| views::transform([](int i) {return std::string(i, char('a'+i));})
| views::cache1
| views::join('-');
check_equal(rng, {'-','b','-','c','c','-','d','d','d'});
CPP_assert(input_range<decltype(rng)>);
CPP_assert(!range<const decltype(rng)>);
CPP_assert(!forward_range<decltype(rng)>);
CPP_assert(!common_range<decltype(rng)>);
所以 OP 问题的解决方案是写
auto rng = src | views::transform(f) | views::cache1 | views::join;
关于c++ - 如何编写使用临时容器的范围管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822467/