我正在尝试初始化锯齿状数组。 为什么这不起作用:
int *arr[10];
for (int *row : arr)
row = new int[10];
它运行但是arr是不可读的。
在这种情况下,如何正确使用这种形式的“for”?
否则,我怎样才能初始化X行的锯齿状数组,每行是Y元素并将所有行设置为零?
答案 0 :(得分:6)
尝试:
int* arr[10];
for (int*& row : arr)
row = new int[10];
由于您要更改循环内部数组中的值,因此需要迭代引用而不是值(这些只是数组中的内容的副本)。这与函数调用语义非常相似。
答案 1 :(得分:1)
for(auto&row:arr) // note the &. also note the auto
row = new int[10];
编译器应该真的警告这个愚蠢的错误。多次发生在我身上。
答案 2 :(得分:0)
电影提供的答案是正确的,但正如其他人已经在评论中所述:如果你真的想学习C ++ 11,你应该使用像std::vector
这样的容器。
例如:
std::vector<std::vector<int>> list;
你已经完成了。您可以根据需要添加任意数量的int
。如果您想拥有动态整数列表的固定大小列表,请考虑使用std::array
:
std::array<std::vector<int>, 10> arr;
如果性能或内存不是问题,我总是建议使用std::vector
。无论如何,你必须确保你没有超过最大数量的元素。
关于for
- 循环,我总是试图以这种方式使用它:
for (auto &item : list)
如果您不想修改列表,请添加const
:
for (const auto &item : list)
即使您不想修改列表,也不会在进行复制时进行复制。