C ++ 11迭代锯齿状数组?

时间:2013-04-29 11:25:11

标签: c++ c++11 jagged-arrays

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

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

它运行但是arr是不可读的。

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

否则,我怎样才能初始化X行的锯齿状数组,每行是Y元素并将所有行设置为零?

3 个答案:

答案 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)

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