你会如何迭代矢量?

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++

Que*_*tin 5

for可以删除元素的循环的规范形式如下:

for(auto i = begin(coll); i != end(coll);) {

    // ...

    if(hasToRemove)
        i = coll.erase(i);
    else
        ++i;
}
Run Code Online (Sandbox Code Playgroud)