用range-v3替换数据

时间:2017-12-15 11:03:53

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

TL; DR

如何获得相同的

结果
std::copy(std::begin(a), std::end(a), std::begin(b));

使用range-v3,可能还有很好的语法?

修改

我遇到麻烦的原因是误解了如何正确使用ranges::copy:第二个参数必须是迭代器,而不是范围对象。我的错;)

尽管如此,我仍然在询问是否有某种语法糖可用于执行范围分配,如下所示:

ranges::???(b) = a | op1 | op2 | ... ; 

问题

我有两个固定大小的向量(在运行时)。我需要对第一个向量中的数据执行一些复杂转换,并将结果存储在第二个向量中。我需要保留第一个向量,我不想创建一个新的临时向量。

公共代码

using namespace std;
vector<double> a;
...
vector<double> b(a.size());

使用std

transform(begin(a), end(a), begin(b), complexFun);

Hybrid std-rangev3

auto transformation = a | ranges::view::transform(complexFun);
copy(begin(transformation), end(transformation), begin(b));

在这个简单的例子中,这样做有点不必要。但是,如果涉及多个操作,则创建范围视图然后使用std::copy特别有用。

我想写什么

ranges::???(b) = a | ranges::view::transform(complexFun);

我期待的是这个功能已经存在,我无法找到它。

2 个答案:

答案 0 :(得分:4)

有几种很好的方法可以做到这一点。首先,如果您还没有目的地vector并且想要创建它:

auto b = a | ranges::view::transform(complexFun) | ranges::to_vector;

其次,如果您已经拥有了要重复使用其容量的目标vector

b.clear(); // Assuming b already contains junk
b |= ranges::action::push_back(a | ranges::view::transform(complexFun));

在这两种情况下,range-v3足够智能,可以为ranges::size(a | ranges::view::transform(complexFun))元素保留目标向量中的容量,以避免因重新分配而产生副本。

答案 1 :(得分:3)

怎么样:

ranges::transform(a, b.begin(), complexfun);