据说如果交换两个容器的值,迭代器将不会变为无效。
所以下面的代码工作正常
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
这可能是一个愚蠢的问题,但我不知道出了什么问题。
答案 0 :(得分:3)
我相信这是因为迭代器属于你交换它的容器。当你用临时交换它时,迭代器指向临时的成员,然后temp被销毁,迭代器变得无效。
我不确定它是如何工作的,但这是我能想到的唯一方法,一个向量的迭代器可以在交换后保持有效(只是将内部指针交换到数组,而不是分配新数组和复制等)。
答案 1 :(得分:2)
这里的迭代器只不过是一个指向数组中项目的指针。
在这两种情况下,您都可以在向量中交换内部数组。在第一种情况下,迭代器现在指向第二个向量所拥有的数组。在第二种情况下,迭代器指向临时向量所拥有的数组和已经释放。
答案 2 :(得分:1)
因为以下临时的范围仅保留到语句结束(;
)
vector<int>(v1).swap(v1);
现在v1
包含自身的副本,它在分号处被破坏。因此,迭代器i
指向;
之后的无效迭代器。
答案 3 :(得分:0)
您的第二个代码摘录是创建v1的副本,然后使用v1进行交换。这会破坏v1向量,并使迭代器失效。