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) {
我有一个数组数组,想用一些值填充它们。
这行不通:
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) {