gpt4 book ai didi

c++ - 用 range-v3 替换数据

转载 作者:太空狗 更新时间:2023-10-29 20:09:17 26 4
gpt4 key购买 nike

长话短说

如何获得相同的结果

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

使用 range-v3,可能还有它漂亮的语法?

编辑

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

尽管如此,我仍然想知道是否有某种语法糖可以用来执行范围赋值,如下所示:

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

问题

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

常用代码

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

与标准

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

混合 std-rangev3

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

在这种简单的情况下,这样做有点不必要。但是,如果涉及多个操作,则创建范围 View 然后使用 std::copy 特别有用。

我想写什么

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

我期望的是此功能已经存在,但我找不到它。

最佳答案

有几个很好的方法可以做到这一点。首先,如果您还没有目标 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 都足够智能,可以在目标 vector 中为 ranges::size(a | ranges::view::transform(complexFun)) 元素保留容量以避免复制由于重新分配。

关于c++ - 用 range-v3 替换数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47831026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com