首页 > 解决方案 > 查看 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);
});

我不确定这是否可能,但如果是这样,我将不胜感激任何提示或指示。

标签: c++vectortuplesc++14c++17

解决方案


好吧,如果您使用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对此问题的回答。


推荐阅读