结构化绑定无需复制即可获取子向量的连续元素
Structured bindings to get consecutive elements of a sub-vector without copying
我有一个 std::vector<T> vec
感兴趣的是连续的 3 个元素块。为了便于处理,我想提取这些元素。目前,代码如下所示:
const T& a = vec[i];
const T& b = vec[i + 1];
const T& c = vec[i + 2];
我想使用结构化绑定将 a
、b
、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&>
是一种选择吗?
Would using std::tuple<T&, T&, T&>
be an option?
它会,并且在标准库中已经有一个实用程序:std::tie
。
它接受任意数量的引用(甚至对不同类型),以及 returns 对相同对象的引用的元组。所以你的用例可以浓缩为
auto getElement(int i) {
return std::tie(vec[i], vec[i+1], vec[i+2]);
}
我有一个 std::vector<T> vec
感兴趣的是连续的 3 个元素块。为了便于处理,我想提取这些元素。目前,代码如下所示:
const T& a = vec[i];
const T& b = vec[i + 1];
const T& c = vec[i + 2];
我想使用结构化绑定将 a
、b
、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&>
是一种选择吗?
Would using
std::tuple<T&, T&, T&>
be an option?
它会,并且在标准库中已经有一个实用程序:std::tie
。
它接受任意数量的引用(甚至对不同类型),以及 returns 对相同对象的引用的元组。所以你的用例可以浓缩为
auto getElement(int i) {
return std::tie(vec[i], vec[i+1], vec[i+2]);
}