c ++:交换向量和指针失效?

时间:2012-12-27 23:54:43

标签: c++ pointers swap invalidation

我似乎遇到了交换两个向量元素的问题。我有两个向量xy,它们包含myclass类型的对象。 myclass只有一位公开成员w。我创建了一个指向w成员x的指针向量,然后交换向量xy。我希望指针的向量仍然指向w的{​​{1}}成员,但似乎并非如此。

这是一个重现我的问题的简单例子。

x

请注意,#include <iostream> #include <vector> using namespace std; struct myclass { double w; }; int main() { vector<myclass> x(10); for(int i=0; i!=10; i++) x[i].w = i; for(auto el : x) std::cout << el.w << std::endl; /* prints i */ std::cout << std::endl; vector<double *> px(10); for(int i=0; i!=10; i++) px[i] = &x[i].w; for(auto el : px) std::cout << *el << std::endl; /* prints i */ std::cout << std::endl; vector<myclass> y(10); for(int i=0; i!=10; i++) y[i].w = 2*i; for(auto el : y) std::cout << el.w << std::endl; /* prints 2*i */ std::cout << std::endl; y.swap(x); for(auto &el : x) std::cout << &el.w << " " << el.w << std::endl; /* prints 2*i as it should */ std::cout << std::endl; for(auto &el : px) std::cout << el << " " << *el << std::endl; /* should print 2*i, but prints i */ std::cout << std::endl; } x已交换元素,但y仍然指向旧元素。我读到使用px不应该使指针/迭代器无效。这是正确的还是我错过了什么? 提前谢谢!

1 个答案:

答案 0 :(得分:5)

指针和迭代器不会失效,但它们遵循容器的内容。

x的内容被交换到y,但迭代器和指向这些值的指针将继续指向它们(即使它们现在位于y中)。

想一想,它怎么能以其他方式运作?如果交换了两个长度不等的容器,那么指向较长容器末端附近元素的指针指向较短的容器?如果必须在内存中移动每个容器的元素以确保指针保持有效,那么如何在swap()中实现O(1)