c++ - 查看 std::vector 中的所有 T>
问题描述
想象一下,我有一个类似于std::vector<std::tuple<Ts...>>
.
从那开始,我想得到一个 " view
" (非复制)到 all T
's 这样我就可以在该视图上进行操作,就好像它是一个类似标准的容器一样。
所以我想拥有:
using tuple_vector = std::vector<std::tuple<int,float,double>>;
tuple_vector tuple_vec = {{1, 4.f, 8.},
{2, 5.f, 9.},
{3, 6.f, 10.},
{4, 7.f, 11.}}
auto int_view = view<int>(tuple_vec);
^^^
type should be some kind of non-owning reference
// what I would like to do
int_view[0] = 10; // modify
assert(int_view[0] == std::get<int>(tuple_vec[0])); // modification should modify tuple_vec as well
我已经尝试过std::transform
了,但后来我得到了所有的副本int
。
std::vector<int> int_vec(tuple_vec.size());
std::transform(tuple_vec.begin(), tuple_vec.end(), int_vec.begin(), [&](const auto& elem) {
return std::get<int>(elem);
});
我不确定这是否可能,但如果是这样,我将不胜感激任何提示或指示。
解决方案
好吧,如果您使用Eric Niebler 的 range-v3 库(该库正在被标准采用 - 现在有Ranges TS),您可以运用直觉来使用类似的东西std::transform
,但有一个观点:
#include <range/v3/view/transform.hpp>
// ... etc. ...
auto int_view = tuple_vector | ranges::view::transform(
[](auto& t)->auto&{ return std::get<int>(t);} );
看到这个在行动(Coliru),甚至修改了其中一个元素。
-> decltype(auto)
注意:如果我们删除;,这个视图将变得不可修改。更改是由于@deduplicator对此问题的回答。
推荐阅读
- python - Theil-Sen 回归:平移 x 轴时的不同结果
- c++ - gcc 冷函数属性与 builtin_expect 行为
- c# - MySQL c# windows窗体应用程序中的rank函数
- java - 尝试从 JSON 字符串映射对象时出现 Gson JsonSyntaxException
- javascript - 在 JavaScript 中,为什么值是在作用域内定义的。但未定义的外部范围?
- c# - Highchart多色线系列动态
- numpy - 给定某些维度的索引,如何在 numpy 数组中选择值?
- amazon-web-services - 为什么 aws s3 bucketpolicy 允许上传对象?
- c# - C#没有通过蓝牙串口发送数据
- mysql - Mysql I 参数中的存储过程