结构化绑定无需复制即可获取子向量的连续元素

时间:2019-10-04 23:32:08

标签: c++ structured-bindings

我有一个std::vector<T> vec,其中三个元素的连续块很有趣。为了便于处理,我想提取此类元素。当前,代码如下:

const T& a = vec[i];
const T& b = vec[i + 1];
const T& c = vec[i + 2];

我想使用结构化绑定将abc的提取压缩到一行。

一个简单的选择就是:

std::tuple<T, T, T> getElement(int i) {
    return std::make_tuple(vec[i], vec[i+1], vec[i+2]);
}

// ...
auto [a, b, c] = getElement(j);

问题是我想避免无用的数据复制。我不确定,但是似乎矢量元素会在这里复制到元组中。是否可以选择使用std::tuple<T&, T&, T&>

1 个答案:

答案 0 :(得分:5)

  

是否可以选择使用std::tuple<T&, T&, T&>

可以,并且在标准库std::tie中已经有它的实用程序。 它接受任意数量的引用(甚至包括对不同类型的引用),并返回对相同对象的引用的元组。因此,您的用例可以压缩为

auto getElement(int i) {
    return std::tie(vec[i], vec[i+1], vec[i+2]);
}