我试图在C++中使用向量。我试图在指定位置使用迭代器插入一个元素,然后再次使用迭代器删除一些元素。但是当两个操作使用相同的迭代器时出现错误,这是我的代码-

#include <iostream>
#include <vector>
#include <cctype>
using namespace std;
int main()
{
    vector <int> A(10);

    for (int i=0;i<A.size();i++)
    {
        A[i]=i+1;
    }
    vector<int>::iterator p=A.begin();
    p+=2;

    A.insert(p,1,55);

    A.erase(p,p+2);
    for (int i=0;i<A.size();i++)
    {
        cout << A[i] <<"\n";
    }
    return 0;
}


这给了我以下输出:

*** Error in `./temp': double free or corruption (out): 0x00000000017d4040 ***
55
3
4
5
6
7
8
9
10
Aborted (core dumped)


如果在A.erase之前添加以下两行,则会得到正确的答案。

p=A.begin();
p+=2;
A.erase(p,p+2);


因此,如果p仍指向相同的元素,因为其值未更改,那么为什么需要再次设置p的值。

最佳答案

std::vector插入/擦除之后,所有现有的迭代器都将无效并且不应使用(使用它们将导致未定义的行为)

请记住,更改向量包含的项目可能会导致内存分配等,因此旧的迭代器可以指向释放的内存(如指针)

因此,当您添加行时,您提到并重新初始化迭代器-一切正常。但是在insert之后,现有的p不再有效。

http://en.cppreference.com/w/cpp/container/vector/erasehttp://en.cppreference.com/w/cpp/container/vector/insert中检查有关“迭代器无效”的段落。

您可能考虑添加对reserve的调用,以确保在insert上不发生任何重新分配,但是在我看来,这样的代码仍然容易出错且难以维护。

09-30 14:50
查看更多