使用Vector包含结构的指针问题
Pointer problem using Vector containing structs
我现在真的被困在如何解决以下问题:
struct node {
int a;
node* b;
}
我将有两个没有父节点的根节点然后有更多指向父节点的节点
vector<node> IholdAllTheNodes;
node noparent1; <--- these get returned from a method
node noparent2;
IholdAllTheNodes.pushback(noparent1);
IholdAllTheNodes.pushback(noparent2);
node withparent1; <---- i am happily points to noparent1
node withparent2; <-----i am happily points to noparent2
到目前为止一切正常
IholdAllTheNodes.pushback(withparent1) <<<< oops this causes all the pointers to move.
现在withparent节点不再指向它们的父节点,因为我已经移动了它们。
我的问题很简单,我如何在不移动原始节点指针的情况下向节点向量添加更多节点。(我不能得到一个固定的大小的向量)
如果有人有时间解释一下,为什么即使推退添加到向量列表的末尾,前面信息的位置也会发生变化?
可以调用reserve
IholdAllTheNodes.reserve(MAX_SIZE);
预先设置以避免重新分配。它要求您事先知道MAX_SIZE。
或者
- 建议:使其成为指针容器
- 使其成为
std::vector<shared_ptr<node> >
(类似但效率较低) - 使其成为
std::vector<node*>
(类似但乏味且容易出错) - 建议:尽量避免使用指针。通过
size_t
(整数)索引将节点地址改为IholdAllTheNodes
而不是
您的问题是您在向量中按值存储节点。它们可能被复制很多次。每次一个节点将被放置在不同的内存地址中。因此,您将收到指向它的不同指针,旧指针将指向无效的位置。
正如其他答案所建议的,使用任何类型的指针将节点存储在vector中。我推荐boost::ptr_vector<node>
或std::vector<boost::shared_ptr<node> >
不同意reserve
的建议:
是很危险的。您需要在所有可能的地方放置大的粗体警告,以便将来修改此代码的人不能忽略它。因为当你向矢量添加超过MAX_SIZE
元素时,你的太空船将在太阳上燃烧。在这种情况下,我建议使用boost::array
,因为它是固定大小的(因此使您的假设更明显),并且至少在调试构建
使用一个特定的大小调用IholdAllTheNodes.reserve()
,它将保证在达到该保留数量之前,进一步的插入不会使指针失效。
相关文章:
- 链表指针问题
- 指针问题:从不兼容的类型"int"分配给"int *"
- C++指针问题:如何修复这些代码中的错误?
- *++*++ppp,*++pp[1],*++(*(1+ppp)有什么具体的区别吗?(C/C++指针问题)
- C++ 入门加列表:10.9 "顶部"指针问题
- C++ 指针问题 - 通过方法更新指针
- 未分配正在释放的指针 - 指针问题
- 双指针问题通过函数传递错误
- 在C++中实现图形 DFS,指针问题
- 返回指针问题
- C++ - 有人有分析指针到指针问题的技巧吗?
- 选择排序指针问题
- 涉及删除操作的 C++ 指针问题
- 模板类指针问题 c++
- Swig和指针问题(python)
- 引用指针问题
- 函数指针问题
- 通过类型C++ 的继承树递归导致此指针问题
- 无法将文件读入字符数组(像往常一样,某些指针问题)
- 结构中的指针问题