【发布时间】:2016-04-14 23:22:52
【问题描述】:
在我的代码中,a 有一个 Node 对象的全局向量和一个 Node 指针的局部向量:
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;
class Node {
int n;
public:
Node(int i) : n(i);
int getN() { return n; }
};
vector<Node> v;
int main() {
vector<Node*> p;
v.push_back(Node(1));
p.push_back(&v[0]);
printf("first node id : %d\n", (*p[0]).getN());
return 0;
}
我将一个节点对象插入到全局向量中,并将该对象的指针插入到本地向量中。我上面代码的输出是:
first node id : 1
但是,如果我将主要功能更改为:
int main()
{
vector<Node*> p;
v.push_back(Node(1));
p.push_back(&v[0]);
v.push_back(Node(2));
p.push_back(&v[1]);
printf("first node id : %d\n", (*p[0]).getN());
return 0;
}
代码打印一个垃圾值:
first node id : 32390176
我无法找出问题所在。
vector 数据结构是否会在插入后更改每个对象的引用?
我该如何解决这个问题?
【问题讨论】:
-
让你的代码更简洁一些(并在 ctor 中使用初始化列表)。
-
我很确定我们有一个副本。无论如何,查阅参考文档(参见Iterator invalidation)应该已经足够清楚了。
-
@πάνταῥεῖ 一个很好的起点。但是,虽然引用失效意味着迭代器失效,但反过来并不成立。
-
@palatok:你知道,你可以用普通的
ints 而不是Nodes 包装ints,这将是一样的......跨度> -
@πάνταῥεῖ:许多新手程序员在开始使用 C++ 向量时并不知道迭代器是什么,并且可能不会意识到“迭代器无效”之类的东西与他们正在做的事情有关。跨度>