mar*_*zzz 0 c++ iteration foreach for-loop cycle
这是我的代码:
std::vector<int> array;
array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(4);
array.push_back(5);
for (int i = 0; i < array.size(); i++) {
if(array[i]==2 || array[i]==5) {
array.erase(array.begin() + i);
printf("### REMOVED ###\n", array[i], i);
}
printf("inside val: %d | index: %d\n", array[i], i);
}
Run Code Online (Sandbox Code Playgroud)
但正如你所看到的,它输出:
inside val: 1 | index: 0
### REMOVED ###
inside val: 3 | index: 1
inside val: 4 | index: 2
### REMOVED ###
inside val: 5 | index: 3
Run Code Online (Sandbox Code Playgroud)
当我的"期望"是:
inside val: 1 | index: 0
### REMOVED ###
inside val: 2 | index: 1
inside val: 3 | index: 2
inside val: 4 | index: 3
### REMOVED ###
inside val: 5 | index: 4
Run Code Online (Sandbox Code Playgroud)
它在处理自身时会使用索引/数组的大小"混乱",因为它会改变内存指针和目标的大小.
我的习惯是使用a foreach statement并迭代一个collection(C#/.Net),即使我在迭代过程中删除/添加元素,下一个也始终是从开头列表开始的下一个元素.
你会怎么做C++?
for可以删除元素的循环的规范形式如下:
for(auto i = begin(coll); i != end(coll);) {
// ...
if(hasToRemove)
i = coll.erase(i);
else
++i;
}
Run Code Online (Sandbox Code Playgroud)