使用 push_back() 时指针指向 NULL 的向量

Vector of pointer points to NULL when using push_back()

本文关键字:NULL 向量 指针 push back 使用      更新时间:2023-10-16

我的代码中有以下结构,它分配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){
apoint.push_back(&thisA);
}

当我尝试使用以下方法打印它们时:

for(unsigned int i = 0; i<5; i++){
cout<< i <<"t"<< a[i].x <<"t" << &a[i]<<"t" << apoint[i] <<endl;
}

我得到我所有的点作为空指针如下:

0       8       0x29b1bd0       0
1       8       0x29b1bd8       0
2       1       0x29b1be0       0
3       8       0x29b1be8       0
4       6       0x29b1bf0       0

代码对我来说似乎是合乎逻辑的,当我在 for 循环中说apoint[i] = &a[i]时可以工作,但在实际情况下这是无效的,因为apointa的索引可能不同。据我所知,我找不到有类似问题的答案。有没有更好的方法将指针插入向量?

vector<const A*> apoint(5);

创建一个vector并预加载 5const A*秒,该秒将默认初始化。这意味着apoint,在你push_back任何东西都包含 5 个空指针之前。由于大小已经是 5,因此apoint.reserve(5);实际上什么都不做。这也适用于vector<A> a(5);

这意味着

for(unsigned int i = 0; i<5; i++){
cout<< i <<"t"<< a[i].x <<"t" << &a[i]<<"t" << apoint[i] <<endl;
}

打印出这 5 个空指针,然后才能到达用push_back添加的 5 个 。改变

vector<const A*> apoint(5);

vector<const A*> apoint;

构造一个空vector或用apoint[index] = &thisA;赋值到这 5 个指针中,并删除 apoint.reserve(5);'The

但。。。

for(const A thisA : a){
apoint.push_back(&thisA);
}

需要进一步分解以发现第二个错误。const A thisA : a复制a中仅存在于for循环的单个迭代中的元素。这些指针太短了,对你没有任何用处。您希望引用a中的值,而不是副本,因此

for(const A thisA : a){
apoint.push_back(&thisA);
}

需要

for(const A & thisA : a){
apoint.push_back(&thisA);
}

有关在vectors 中存储对项目的引用的说明:这通常是一个坏主意。如果提出新问题并解释您的目标,我们也许能够提出更好的替代方案。如果您确实需要指向vector元素的指针,请非常小心,不要违反迭代器失效规则。

for(const A thisA : a){
apoint.push_back(&thisA);
}

您推送的指针在下一个循环中不再有效。您需要一个参考 (A&)。

当然,假设你真的需要一个指针向量(你吗?