使用push_back()

时间:2019-06-17 18:55:16

标签: 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){
    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;
}

我的所有观点都是NULL指针,如下所示:

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的索引可能无效据我所知,我找不到类似问题的答案。有没有更好的方法将指针插入向量?

2 个答案:

答案 0 :(得分:1)

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

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

当然,假设您确实需要一个指针向量(对吗?)

答案 1 :(得分:1)

vector<const A*> apoint(5);

制作一个vector并预加载5个const 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;
}

在到达push_back添加的5个空指针之前,先打印出这5个空指针。更改

vector<const A*> apoint(5);

vector<const A*> apoint;

构造一个空的vector或使用apoint[index] = &thisA;分配到这5个指针中,并删除The apoint.reserve(5);`。

但是...

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);
}

关于在vector s中存储对项目的引用的注释:这通常是个坏主意。如果提出新问题并解释您的目标,我们可能会提出更好的选择。如果确实需要指向vector元素的指针,请非常小心,不要违反Iterator invalidation rules