向量迭代器运行不正常

vector iterator not behaving properly

我想迭代地使用insert修改vector<int>中的第一个元素(我知道用vector最好在后面插入元素,我只是玩)。

    int main() {
        vector<int> v1 = {1,2,2,2,2};
        auto itr = v1.begin();
        print_vector(v1);
        cout<<*itr<<endl; // ok, itr is pointing to first element
        v1.insert(itr,3); 
        cout<<*itr<<endl; // after inserting 3 itr is still pointing to 1
        print_vector(v1); 
        cout<<*itr<<endl; // but now itr is pointing to 3 
        v1.insert(itr,7); 
        print_vector(v1); 
        cout<<*itr<<endl;
        return 0;
    }

v[]: 1 2 2 2 2
1
1
v[]: 3 1 2 2 2 2
3
v[]: 131072 3 1 2 2 2 2

Process finished with exit code 0

所以我这里的问题主要是2:

  1. v1.insert(itr,3)之后,itr仍然指向1print_vector() 调用后 itr 指向 3为什么
  2. 现在 itr 它指向 3v1 的第一个元素)。我调用 v1.insert(itr,7) 但不是将 7 作为第一个元素,而是放置 131072。同样,为什么?

我实现的print_vector函数如下:

void print_vector(vector<int> v){
    cout<<"v[]: ";
    for(int i:v){
        cout<<i<<" ";
    }
    cout<<endl;
}
   

将元素插入到 vector 后,其所有迭代器均无效,这意味着涉及它们的任何行为都属于未定义行为。您可以在 Iterator invalidation rules for C++ containers.

的答案中找到迭代器失效条件的列表

您在第一次 v1.insert() 调用后遇到的任何事情都属于未定义行为,您可以清楚地看到 131072(任意值)的放置。

如果在每次插入调用后刷新迭代器,您应该会得到正常的行为:

int main()
{
    vector<int> v1 = { 1,2,2,2,2 };
    auto itr = v1.begin();
    print_vector(v1);
    cout << *itr << endl;

    v1.insert(itr, 3);
    itr = v1.begin(); // Iterator refreshed

    cout << *itr << endl;
    print_vector(v1);
    cout << *itr << endl;

    v1.insert(itr, 7);
    itr = v1.begin(); // Iterator refreshed

    print_vector(v1);
    cout << *itr << endl;

    return 0;
}

并且输出:

v[]: 1 2 2 2 2
1
3
v[]: 3 1 2 2 2 2
3
v[]: 7 3 1 2 2 2 2
7