使用 push_back() 时指针指向 NULL 的向量
Vector of pointer points to NULL when using push_back()
我的代码中有以下结构,它分配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]
时可以工作,但在实际情况下这是无效的,因为apoint
和a
的索引可能不同。据我所知,我找不到有类似问题的答案。有没有更好的方法将指针插入向量?
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);
}
有关在vector
s 中存储对项目的引用的说明:这通常是一个坏主意。如果提出新问题并解释您的目标,我们也许能够提出更好的替代方案。如果您确实需要指向vector
元素的指针,请非常小心,不要违反迭代器失效规则。
for(const A thisA : a){
apoint.push_back(&thisA);
}
您推送的指针在下一个循环中不再有效。您需要一个参考 (A&
)。
当然,假设你真的需要一个指针向量(你吗?
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- 我可以为向量函数返回 NULL<double> 吗?
- 使用 push_back() 时指针指向 NULL 的向量
- 为什么类中的向量自动变为 NULL
- 对象向量中的空对象与指针向量中的NULL/nullptr
- 在std向量中查找NULL指针
- basic_string::_M_construct null 在构造字符串的子向量后无效
- 如何用NULL(c++)初始化对的向量
- 指针指向NULL向量
- 不能将NULL发送给获取向量的函数
- 在一个向量中找到NULL
- 与向量一起使用的C++可为Null/可选项的整数
- 检查在模板第一个参数之后声明的函数是否为 NULL(传递向量和数组)