返回 std::未知大小的数组

Return std::array of unknown size

本文关键字:数组 未知 std 返回      更新时间:2023-10-16

我想从我的函数返回一个多维的std::array。返回数组的大小应由输入参数的大小决定。 像这样:

std::array<std::array<unsigned int, n>, n> foo(std::vector<int> vec){
unsigned int n = vec.size;
std::array<std::array<unsigned int, n>, n> result;
return result;
}

在没有烦人的附加模板参数的情况下解决这个问题会很好。 std::vector 而不是 std::array 似乎不像 std::array 那样使用 n(未确定)项进行初始化(没有显式初始化)。这怎么可能呢?谢谢!

您需要知道的第一件事是std::array在编译时固定了其大小,正如 cppreference sais 中的文档:

std::array 是一个封装固定大小数组的容器。

此容器是具有与 将 C 样式数组 T[N] 作为其唯一非静态数据的结构 成员。

如果n来自std::cin或命令行参数(或编译时以外的任何类型的输入),则编译器无法推断类型,因此将引发错误。

最明智的方法是使用std::vector,您可以这样做:

std::vector<std::vector<unsigned int>> foo(std::vector<int> vec){
unsigned int n = vec.size();
std::vector<std::vector<unsigned int>> result(n, std::vector<unsigned int>(n));
return result;
}

只需使用向量的大小构造函数初始化每个向量。

您可以使用其 c'tor 创建一个大小为n大小的std::vectorn大小的std::vector,即:

std::vector<std::vector<unsigned int>> result(n, std::vector<unsigned int>(n, 0));

注意:根据 cppreference.com,上面std::vectors c'tor 示例中使用的第二个参数是要创建的每个项目的值:c'tor 签名:

vector( size_type count, const T& value, const Allocator& alloc = Allocator());.

尝试使用 Boost.MultiArray。它允许您创建具有任意内容类型内容的多维数组。我已经使用了它(更具体的是 boost::multi_array_ref 部分),它的效果非常好。一个重要的功能是能够创建数组视图(以及基于视图的切片)。