首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用range-v3替换数据

用range-v3替换数据
EN

Stack Overflow用户
提问于 2017-12-15 11:03:52
回答 2查看 751关注 0票数 3

TL;DR

如何才能获得同样的结果

代码语言:javascript
复制
std::copy(std::begin(a), std::end(a), std::begin(b));

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

编辑

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

尽管如此,我仍在问是否有某种语法糖可用于执行远程任务,例如:

代码语言:javascript
复制
ranges::???(b) = a | op1 | op2 | ... ; 

问题所在

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

公共代码

代码语言:javascript
复制
using namespace std;
vector<double> a;
...
vector<double> b(a.size());

与性病

代码语言:javascript
复制
transform(begin(a), end(a), begin(b), complexFun);

杂交std-rangev3 3

代码语言:javascript
复制
auto transformation = a | ranges::view::transform(complexFun);
copy(begin(transformation), end(transformation), begin(b));

在这种简单的情况下,这样做有点不必要。但是,如果涉及多个操作,则使用std::copy创建range视图尤其有用。

我想写的东西

代码语言:javascript
复制
ranges::???(b) = a | ranges::view::transform(complexFun);

我所期待的是,这个特性已经存在,而且我无法找到它。

EN

回答 2

Stack Overflow用户

发布于 2017-12-15 14:23:46

不如:

代码语言:javascript
复制
ranges::transform(a, b.begin(), complexfun);

编辑:.。或者也许

代码语言:javascript
复制
ranges::copy( a | ranges::views::transform(complexFun), begin(b) );
票数 4
EN

Stack Overflow用户

发布于 2017-12-15 14:55:16

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

代码语言:javascript
复制
auto b = a | ranges::view::transform(complexFun) | ranges::to_vector;

其次,如果您已经有了一个目标vector,您希望重用它的容量:

代码语言:javascript
复制
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))元素保留容量,以避免由于重新分配而造成的副本。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47831026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档