3

我有一个std::vector<T> vec感兴趣的 3 个元素的连续块。为了便于处理,我想提取这些元素。目前,代码如下所示:

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

我想使用结构化绑定将 , 的提取压缩ab一行c

一个简单的选项将类似于以下内容:

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&>是一种选择吗?

4

1 回答 1

5

使用std::tuple<T&, T&, T&>是一种选择吗?

它会,并且标准库中已经有一个实用程序:std::tie. 它接受任意数量的引用(甚至对不同类型的引用),并返回对相同对象的引用元组。所以你的用例可以浓缩为

auto getElement(int i) {
    return std::tie(vec[i], vec[i+1], vec[i+2]);
}
于 2019-10-04T23:35:19.267 回答