1

我正在尝试初始化一个锯齿状数组。为什么这不起作用:

int *arr[10];
for (int *row : arr)
    row = new int[10];

它运行但随后 arr 不可读。

在这种情况下如何正确使用这种形式的“for”?

否则我怎么能初始化一个 X 行的锯齿状数组,每一行都是 Y 元素并将全部设置为零?

4

3 回答 3

6

尝试:

int* arr[10];
for (int*& row : arr)
    row = new int[10];

由于您正在更改循环内数组中的值,因此您需要迭代引用而不是值(它们只是数组中内容的副本)。这与函数调用语义非常相似。

于 2013-04-29T11:28:38.290 回答
1
for(auto&row:arr)      // note the &. also note the auto
  row = new int[10];

编译器真的应该警告这个愚蠢的错误。发生在我身上很多次。

于 2013-04-29T12:31:31.763 回答
0

filmor 提供的答案是正确的,但正如其他人在评论中已经指出的那样:如果你真的想学习 C++11,你应该使用像std::vector.

例如:

std::vector<std::vector<int>> list;

你完成了。您可以添加任意数量int的 s。如果您想拥有一个固定大小的动态 int 列表,请考虑使用std::array

std::array<std::vector<int>, 10> arr;

std::vector尽管如果性能或内存不是问题,我总是建议使用。你必须确保你没有超过元素的最大数量。

关于for-loop,我总是尝试以这种方式使用它:

for (auto &item : list)

如果您不想修改列表,请添加const

for (const auto &item : list)

即使您不想修改列表,您也不会在处理列表时进行复制。

于 2013-04-29T12:34:34.490 回答