是否可以在C++中获取 std::array 的子数组

Is it possible to get a sub-array of a std::array in C++?

本文关键字:array 数组 std 获取 C++ 是否      更新时间:2023-10-16

我想做类似的事情

std::array<int, 5> array1 = {{ ... }};
const std::array<int, 3>& array2 = array1[1:4]; // [x:y] doesn't exist

也就是说,获取一个数组,该数组是另一个数组的一种视图,而不必复制它。

不,你不能那样做。所有标准库容器都是其数据的唯一所有者,std::array也不例外。事实上,std::array被限制以这样一种方式实现,以便元素存储在类的实际数组成员中,这将使别名变得不可能。

有一个关于array_view类的建议,该类将表示一个连续数据块的非拥有视图。你可以在这里阅读它。我不知道这个提案的状态(当前的C++标准化过程让我感到困惑)。

如果你使用valarray而不是array,你可以http://en.cppreference.com/w/cpp/numeric/valarray/slice

编辑:从 C++20 开始,您可以使用 std::span 引用连续的子数组

是的,你可以,C++20 中的 std::span 提供了对连续对象序列的视图。

std::array<int, 5> array1 = {20, 10, 35, 30, 5};
std::span array2(array1.begin(), array1.begin() + 3); // {20, 10, 35}; subview of array1

基础数据不会被复制,而是被引用,因此在使用 span 时应注意确保原始数组仍然存在。

std::array<int, 3>& array2 = reinterpret_cast<std::array<int, 3>&>(array1);