gk2*_*gk2 4 c++ range lifetime range-v3
我想制作一个像np.arange()
. 对于 range-v3,代码是
auto arange(double start, double end, double step){
assert(step != 0);
const auto element_count = static_cast<int>((end - start) / step) + 1;
return ranges::views::iota(0, element_count) | ranges::views::transform([&](auto i){ return start + step * i; });
}
Run Code Online (Sandbox Code Playgroud)
并使用它,
auto range = arange(1, 5, 0.5);
for (double x : range){
std::cout << x << ' '; // expect 1 1.5 2 2.5 3 3.5 4 4.5 5
}
Run Code Online (Sandbox Code Playgroud)
然而,结果告诉我一个虚拟值。我认为返回的范围对象的生命周期已经过期,并且我发现通过将它们制作为向量可以很好地传递结果。(这会导致构建向量的开销。)
有没有办法在没有过期寿命的情况下返回范围本身?
由于通过捕获局部变量,您成为了未定义行为的受害者[&]
。
如果您按值捕获[start, step](auto i){ return start + step * i; }
,代码将正常工作。
请注意,视图始终是非拥有的,可以复制,并且其存储通常为 O(1)。由于iota
是生成视图并将其完整状态存储在其内部,因此代码是安全的。
归档时间: |
|
查看次数: |
104 次 |
最近记录: |