繁体   English   中英

在C ++中为2D C样式数组使用初始化列表

[英]Using an initializer list for a 2D C style array in C++

我想使用{}初始值设定项来初始化2D数组,但无法使其正常工作:

int** spiral = new int*[1001]{new int[1001] {0}};

第一行被分配并初始化为0,而其他所有行均未分配。

这可以工作,但是我很确定我可以无循环地执行此操作:

int** spiral = new int*[1001];
for (unsigned i = 0; i < 1001; i++)
    spiral[i] = new int[1001] {0};

我在这里想念什么?

int ** spiral = new int * [1001] {new int [1001] {0}};

int x[10] = {0};的零初始化数组的C约定int x[10] = {0}; 让人们知道可以通过提供单个初始化程序来初始化数组,并将其应用于每个元素。 这是一个合理但不正确的推断。 代码int x[10] = {1}; 仅将第一个元素初始化为该值,并且没有初始化程序的每个值都将初始化为零。

您必须为每个元素提供一个初始化程序,或者在循环中初始化元素,或者以某种方式显式初始化每个元素。


有更好的方法来创建具有固定维数的多维数组。 这是一种方法:

using arr2d = std::array<std::array<int, 1001>, 1001>;
auto spiral =std::unique_ptr<arr2d>(new arr2d{});
(*spiral)[100][100];

这可以做得更漂亮,但是它做对了:它使用动态分配来避免堆栈溢出的风险,但是将其限制为单个分配,并且以异常安全的方式保存内存。

我希望能够做到:

auto spiral = make_unique<array<int, 1001, 1001>>();
spiral[100][100];

当然,实现上述目标并不是很困难,但尚未标准化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM