c++ - 迭代器在与临时容器交换后变得无效

标签 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

这可能是个愚蠢的问题,但我不知道哪里出了问题。

最佳答案

我相信这是因为迭代器属于您与之交换的容器。当您将它与临时对象交换时,迭代器指向临时对象的成员,然后临时对象被销毁并且迭代器变为无效。

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

关于c++ - 迭代器在与临时容器交换后变得无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7006718/

相关文章:

iterator - 减少 Julia 中生成器的内存分配

c++ - 可能的 std::async 实现错误 Windows

c++ - 代码块和 OpenGL

c++ - C++ 元编程中的蹦床

c++ - 解析 VS2010 MSBuild vcxproj 文件

c++ - 如何在标准 C++ 字符串中使用 3 和 4 字节的 Unicode 字符?

c++ - 有没有理由使用 std::list?

java - 当我事先检查是否存在元素时,为什么会引发 NoSuchElement 异常?

Python 迭代 - 查找字符串中数字的乘积的问题

c++ - 派生类中何时实际需要 "virtual"属性?