0

我刚刚尝试了一些 STL,但遇到了一个问题,我无法解释它是如何工作的。我在下面有一些代码:

int main(int argc, char **argv) {
    vector<int> myvector(3,20);
    vector<int>::iterator it;

    myvector.push_back(12);
    myvector.push_back(15);

    int i = 0;
    for(it = myvector.begin(); it!=myvector.end(); it++)
    {
        if(*it==20)
        {
            cout<<"delete "<<i<<endl;

            myvector.erase(it);
        }
        i++;
    }

    for(it = myvector.begin(); it!=myvector.end(); it++)
        cout<<*it<<"  ";

vector.erase() 没有擦除第三项(我的向量中的“20”),它打印出:20 12 15,但我认为我应该是:12 15。

所以,任何人都可以解释它是如何为我工作的,或者我在哪里犯了一些错误?非常感谢。

4

1 回答 1

1

当您使用迭代器删除 STL 容器中的项目时,任何先前的迭代器都将变为无效。所以在 myvector.erase(it) 之后,它不再有效。为了解决这个问题,erase 返回一个新的迭代器,指向下一个元素。所以你的代码应该是:

for(it = myvector.begin(); it!=myvector.end(); )
{
    if(*it==20)
    {
        cout<<"delete "<<i<<endl;

        it = myvector.erase(it);
    } else {
        it++;
    }
    i++;
}

我也只在循环中增加它。这样,当您擦除时,您不会向前跳跃额外的元素。

于 2013-10-02T04:00:26.980 回答