【发布时间】:2012-12-27 23:54:42
【问题描述】:
我似乎在交换两个向量的元素时遇到了问题。我有两个向量,x 和 y,它们包含 myclass 类型的对象。 myclass 只有一个公共成员 w。我创建了一个指向x 的成员w 的指针向量,然后交换向量x 和y。我希望指针向量仍然指向x 的w 成员,但情况似乎并非如此。
这是一个重现我的问题的简单示例。
#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 仍然指向旧元素。我读到使用swap 不应该使指针/迭代器无效。这是正确的还是我错过了什么?
提前致谢!
【问题讨论】:
-
文档说它们不会失效,而且它们还没有失效——这意味着它们仍然指向他们一直指向的地方。
标签: c++ pointers swap invalidation