我正在尝试初始化一个锯齿状数组。为什么这不起作用:
int *arr[10];
for (int *row : arr)
row = new int[10];
它运行但随后 arr 不可读。
在这种情况下如何正确使用这种形式的“for”?
否则我怎么能初始化一个 X 行的锯齿状数组,每一行都是 Y 元素并将全部设置为零?
我正在尝试初始化一个锯齿状数组。为什么这不起作用:
int *arr[10];
for (int *row : arr)
row = new int[10];
它运行但随后 arr 不可读。
在这种情况下如何正确使用这种形式的“for”?
否则我怎么能初始化一个 X 行的锯齿状数组,每一行都是 Y 元素并将全部设置为零?
尝试:
int* arr[10];
for (int*& row : arr)
row = new int[10];
由于您正在更改循环内数组中的值,因此您需要迭代引用而不是值(它们只是数组中内容的副本)。这与函数调用语义非常相似。
for(auto&row:arr) // note the &. also note the auto
row = new int[10];
编译器真的应该警告这个愚蠢的错误。发生在我身上很多次。
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)
即使您不想修改列表,您也不会在处理列表时进行复制。