This question already has answers here:
Removing item from vector while iterating?
                                
                                    (8个答案)
                                
                        
                                3年前关闭。
            
                    
这是my code

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);
}


但是如您所见,它输出:

inside val: 1 | index: 0
### REMOVED ###
inside val: 3 | index: 1
inside val: 4 | index: 2
### REMOVED ###
inside val: 5 | index: 3


当我的“期望”是:

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


它在操作自身时会“索引”索引/数组的大小,因为这会改变内存指针和目标的大小。

我的习惯是使用foreach statementiterate a collection (C#/.Net),即使在迭代过程中删除/添加元素,下一个始终是开始列表中的下一个。

C++您将如何处理?

最佳答案

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

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

    // ...

    if(hasToRemove)
        i = coll.erase(i);
    else
        ++i;
}

10-01 14:40