【问题标题】:C++11 iterate over jagged array?C ++ 11迭代锯齿状数组?
【发布时间】:2013-04-29 11:25:10
【问题描述】:

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

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

它运行,但 arr 不可读。

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

否则如何初始化一个由 X 行组成的锯齿状数组,每行是 Y 个元素并全部设置为零?

【问题讨论】:

  • 虽然它没有解释为什么它不起作用,但为了 Finagle,请使用 std::vector。
  • C++ 的星星太多了。

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


【解决方案1】:

试试:

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

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

【讨论】:

  • 该死的!,我正在做 (int&* row: arr) !应该考虑切换顺序...谢谢
  • 不,您应该考虑过不使用原始指针和 C 样式数组。
  • int &* row IIRC 是非法且无意义的指向 int 的指针。
  • @Spacemonkey 你可以改用(auto& row : arr)
  • @Spacemonkey C++ 不允许指向引用的指针(例如,int &*)。
【解决方案2】:
for(auto&row:arr)      // note the &. also note the auto
  row = new int[10];

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

【讨论】:

    【解决方案3】:

    filmor 提供的答案是正确的,但正如其他人在 cmets 中已经说明的那样:如果你真的想学习 C++11,你应该使用像 std::vector 这样的容器。

    例如:

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

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

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

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

    关于for-loop,我总是会尝试这样使用它:

    for (auto &item : list)
    

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

    for (const auto &item : list)
    

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

    【讨论】:

    • auto const&amp;,因为为了保持一致性,const 最好放在右侧(它只能放在最外层的左侧,这非常令人困惑)
    • 如果我不关心性能,我什至不会使用 C++。
    • @MatthieuM。我认为这主要是一个品味问题,只会导致关于什么是对什么是错的无休止的讨论。
    • @Excelcius:一般来说,我不太关心这些问题(缩进、大括号的放置等......);但是在这种情况下,左侧放置确实会令人困惑。例如,考虑一个模板方法void foo(const T&amp;)。如果T 是int,那么你有一个const int&amp;,它是一个对int 的常量引用,一切都很好。如果T 是int*,那么你有一个const int*&amp;,它是一个对int* 的常量引用,即指针 是const,而不是int,甚至虽然const 更接近int 而你读到const, int, pointer...
    • @Excelcius: ... 现在写T const&amp; 并用int* 代替T。然后你有int* const&amp;,与const int*&amp; 相同的类型,把它(从右到左)读取为指向int 的指针的const-reference,这正是它的本质。当然,对于经验丰富的开发人员来说,这只是一个需要考虑的怪癖,但对于该语言的新手来说,这种不一致是完全令人困惑的。
    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2011-06-10
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多