std::array 上基于范围的 For 循环

Range Based For Loop on std::array

我有一个数组数组,想用一些值填充它们。

这行不通:

std::array<std::array<int, 5>, 4> list;

for (auto item : list) {
    std::fill(item.begin(), item.end(), 65);
}

但是,这样做:

for (int i = 0; i < 4; i++) {
    std::fill(list[i].begin(), list[i].end(), 65);
}

我错过了什么?查看调试器,第一个示例在 list 上什么也不做。 item 的类型是 std::array<int, 5>,正如预期的那样,所以我不确定出了什么问题。

在您的第一个代码片段中,item 变量将是循环中每个数组的 copy;所以,修改不会影响'originals'。事实上,由于 item 从未实际使用过,整个循环可能会被编译器“优化掉”。

要解决此问题,请将 item 设为对迭代数组元素的 引用

for (auto& item : list) {
    //...

你的第一个循环大致相当于:

for (int i = 0; i < 4; i++) {
    auto item = list[i];
    std::fill(item.begin(), item.end(), 65);
}

你能发现问题吗? item 是数组元素的副本。您正在修改副本而不是元素。简单的解决方案:使用参考:

for (auto& item : list) {