2011-08-10 42 views
1

据说如果交换两个容器的值,则迭代器不会失效。迭代器在与临时容器交换后变为无效

所以下面的代码工作正常

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

为什么有投票结束该问题?似乎对我有效。 –

+1

请注意,您可以改为存储索引,因为这是相对于基本数组。 – GManNickG

回答

3

我相信这是因为迭代器属于你交换它的容器。当你将它与一个临时对象交换时,迭代器指向临时对象的成员,然后temp被销毁并且迭代器变为无效。我不知道它是如何工作的,但它是唯一的方法我可以想到,一个向量的迭代器在交换后可以保持有效(只需将内部指针交换到数组,而不是分配新数组)和复制等)。

+0

感谢您的澄清。我认为临时区应该在一个街区结束时被销毁。 – asir6

1

由于以下临时的范围仍然只是直到语句(;)结束

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

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

+1

这是关键。未命名的临时文件仅在最后一次使用时才有效。 – Keith

0

你的第二个代码摘录是创建v1的副本,然后与v1交换。这破坏了v1矢量,并且使迭代器失效。

2

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

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