使用临时容器交换后,迭代器变为无效

时间:2011-08-10 06:29:48

标签: c++ stl iterator

据说如果交换两个容器的值,迭代器将不会变为无效。

所以下面的代码工作正常

vector<int> v1;
v1.push_back(1);
vector<int>::iterator i = v1.begin();

vector<int> v2(v1);
v2.swap(v1);
cout<<*i<<endl;  //output 1

但当我转向临时容器时,迭代器变为无效,程序崩溃。

vector<int> v1;
v1.push_back(1);
vector<int>::iterator i = v1.begin();

vector<int>(v1).swap(v1);
cout<<*i<<endl;  //i become invalid and program crashes here

这可能是一个愚蠢的问题,但我不知道出了什么问题。

4 个答案:

答案 0 :(得分:3)

我相信这是因为迭代器属于你交换它的容器。当你用临时交换它时,迭代器指向临时的成员,然后temp被销毁,迭代器变得无效。

我不确定它是如何工作的,但这是我能想到的唯一方法,一个向量的迭代器可以在交换后保持有效(只是将内部指针交换到数组,而不是分配新数组和复制等)。

答案 1 :(得分:2)

这里的迭代器只不过是一个指向数组中项目的指针。

在这两种情况下,您都可以在向量中交换内部数组。在第一种情况下,迭代器现在指向第二个向量所拥有的数组。在第二种情况下,迭代器指向临时向量所拥有的数组和已经释放

答案 2 :(得分:1)

因为以下临时的范围仅保留到语句结束(;

vector<int>(v1).swap(v1);

现在v1包含自身的副本,它在分号处被破坏。因此,迭代器i指向;之后的无效迭代器。

答案 3 :(得分:0)

您的第二个代码摘录是创建v1的副本,然后使用v1进行交换。这会破坏v1向量,并使迭代器失效。