你将如何迭代一个向量

How would you iterate a vector?

本文关键字:一个 向量 何迭代 迭代      更新时间:2023-10-16

这是我的代码:

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: %dn", 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 statement并迭代集合(C#/.Net),其中即使我在迭代过程中删除/添加元素,下一个元素始终是起始列表中的下一个。

您将如何使用C++

可以移除元素的for循环的规范形式如下:
for(auto i = begin(coll); i != end(coll);) {
    // ...
    if(hasToRemove)
        i = coll.erase(i);
    else
        ++i;
}

使用迭代器:

int ind = 0;
for (auto i = array.begin(); i != array.end(); ) {
    if(*i==2 || *i==5) {
        i = array.erase(i);
        printf("### REMOVED ###n");
    } 
    else {
    ++i;
    ++ind;
    }
    printf("inside val: %d | index: %dn", *i, ind);
}

只需像这样更改代码即可

for (int i = 0; i < array.size(); i++) {
    int temp=i;
    if(array[temp]==2 || array[temp]==5) {
        array.erase(array.begin() + temp);
        printf("### REMOVED ###n", array[temp], temp);
        i--;
    } 
    printf("inside val: %d | index: %dn", array[temp], temp);
}