C++ 使用push_back()时指针的向量指向NULL
我的代码中有以下结构,它随机分配x和y生成的整数值:C++ 使用push_back()时指针的向量指向NULL,c++,pointers,vector,C++,Pointers,Vector,我的代码中有以下结构,它随机分配x和y生成的整数值: struct A{ int x,y; A () : x(random_gen_num),y(random_gen_num) {}; }; 我有一个对象向量,需要一个指向每个对象的指针向量: vector<A> a(5); a.reserve(5); vector<const A*> apoint(5); apoint.reserve(5); for(const A thisA : a){
struct A{
int x,y;
A () : x(random_gen_num),y(random_gen_num) {};
};
我有一个对象向量,需要一个指向每个对象的指针向量:
vector<A> a(5);
a.reserve(5);
vector<const A*> apoint(5);
apoint.reserve(5);
for(const A thisA : a){
apoint.push_back(&thisA);
}
在我看来,当我在for循环中说apoint[I]=&a[I]
时,代码似乎是合乎逻辑的,但在实际情况下,这是无效的,因为apoint
和a
的索引可能不相同。据我所知,我找不到一个有类似问题的答案。有没有更好的方法将指针插入向量
for(const A thisA : a){
apoint.push_back(&thisA);
}
推送的指针在下一个循环中不再有效。您需要一个引用(a&
)
当然,假设你真的需要一个指针向量(你呢?)
打印出这5个空指针,然后它将到达通过推回
添加的5个空指针。改变
vector<const A*> apoint(5);
需要进一步细分才能发现第二个bugconst A thisA:A
复制A
中的元素,这些元素只存在于for
循环的单个迭代中。这些指针太短暂,对您没有任何用处。您希望引用a
中的值,而不是副本,因此
for(const A thisA : a){
apoint.push_back(&thisA);
}
需要
for(const A & thisA : a){
apoint.push_back(&thisA);
}
关于在
vector
s中存储对项目的引用的注意事项:这通常是个坏主意。如果你提出一个新问题并解释你的目标,我们可能会提出更好的选择。如果您确实需要指向向量元素的指针,请小心不要违反。请提供一个,您试图解决的实际问题是什么?为什么您认为需要指向另一个向量中对象的指针向量?是的,不清楚为什么需要apoint
。当你想知道a
中某个元素的地址时,只需使用&a[i]
,尽管我怀疑你是否需要它。是的,需要一个指针向量,因为在实际的程序中,我想把它转换到另一个函数进行计算。但是,谢谢。我并没有考虑thisA的范围。apoint
包含十个指针–五个空指针,后跟五个悬空指针。
for(unsigned int i = 0; i<5; i++){
cout<< i <<"\t"<< a[i].x <<"\t" << &a[i]<<"\t" << apoint[i] <<endl;
}
vector<const A*> apoint(5);
vector<const A*> apoint;
for(const A thisA : a){
apoint.push_back(&thisA);
}
for(const A thisA : a){
apoint.push_back(&thisA);
}
for(const A & thisA : a){
apoint.push_back(&thisA);
}