如何将元素添加到指针向量中
How to add an element into the vector of pointers?
>我有这个:
std::vector <BinaryTree*> children;
其中BinaryTree
是一个类。如何将元素添加到此向量中?
我尝试children.push_back(X)
X
是类的实例,但它给了我这个错误:
无法将参数 1 从"二进制树"转换为"二进制树 *&&">
只需使用 push_back()
并传递指向 BinaryTree
实例的指针:
std::vector <BinaryTree*> children;
BinaryTree* pTree = new BinaryTree();
children.push_back(pTree);
...
delete pTree;
为了避免手动内存管理,如果需要引用语义,请使用智能指针而不是原始指针:
#include <memory> // For std::shared_ptr
std::vector <std::shared_ptr<BinaryTree>> children;
std::shared_ptr<BinaryTree> pTree = std::make_shared<BinaryTree>();
children.push_back(pTree);
...
// No need to delete pTree
std::shared_ptr<>
类模板是 C++11 标准库的一部分。在 C++03 中,您可以使用(几乎(等效的boost::shared_ptr<>
:
#include <boost/shared_ptr.hpp> // For std::shared_ptr
std::vector <boost::shared_ptr<BinaryTree>> children;
boost::shared_ptr<BinaryTree> pTree = boost::make_shared<BinaryTree>();
children.push_back(pTree);
...
// No need to delete pTree
最后,如果您根本不需要引用语义并希望将二叉树视为值,您甚至可以考虑定义一个std::vector<BinaryTree>
:
std::vector<BinaryTree> children;
BinaryTree tree;
children.push_back(tree);
省略模板参数中的星号*
:
std::vector<BinaryTree> children;
您希望子级保存数据,而无需像new BinaryTree
那样手动/动态分配内存。
这实际上取决于谁应该拥有指针。在最简单的情况下,如果向量不拥有它们,则传递BinaryTree
对象的地址。
BinaryTree b = ...;
children.push_back(&b);
但你必须确保b
至少和children
一样长。
如果向量拥有指针,那么您可能应该存储智能指针以避免处理内存管理:
std::vector<std::unique_ptr<BinaryTree>> children;
children.push_back(std::unique_ptr<BinaryTree>(new BinaryTree(args)));
如果您不知道所有这些"所有权"业务的含义,那么您很可能最好使用简单的对象向量:
std::vector<BinaryTree> children;
std::vector<SomeObject*> objectVector;
objectVector.push_back(new SomeObject());
是我怎么做的。
children.push_back(&X);
这将起作用,但请记住,一旦您的对象离开范围,其删除器将被调用,并且您将留下一个无效的指针。
children.push_back(&X);
传递地址,就像将其用作指针一样。但问题是,如果该实例超出范围,那么最好这样做
BinaryTree* X = new BinaryTree;
children.push_back(X);
这将确保 X 永远不会超出范围,但您必须在完成它时手动删除它。
vector
包含指向类型为 BinaryTree
的对象的指针。你需要
BinaryTree bt;
children.push_back( &bt );
但是必须确保bt
对象的生存期至少与vector
的生存期匹配。
你可能想要这个
children.push_back( new BinaryTree );
但在这种情况下,您必须在vector
中包含的指针上调用delete
以防止内存泄漏。
很明显,这两种选择都不容易管理。一个简单的更改是使容器按值存储元素。
std::vector<BinaryTree> children;
BinaryTree bt;
children.push_back( bt );
如果必须存储指针,请改用智能指针来保存它们。
std::vector<std::unique_ptr<BinaryTree>> children;
children.push_back( new BinaryTree );
现在,您无需担心在清空矢量之前删除对象。
指针向量:
std::vector <BinaryTree*> children;
所以添加元素的正确方法是:
BinaryTree* child = new BinaryTree();
children.push_back(child);
在做这样的事情时要小心:
{
BinaryTree child;
children.push_back(&child);
}
因为此类元素的生存期可能短于向量的生存期,并且您最终可能会尝试访问不再存在的元素(悬空指针(,从而产生未定义的行为。另外,在使用完后不要忘记delete
这些元素。
但是考虑首先使用对象向量(即std::vector<BinaryTree>
(总是好的,因为这会为您处理丑陋的内存管理。
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如何更改唯一指针向量的可见性
- 如何在基类指针向量的元素上应用重载的多态函数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 包含指向其他结构的指针向量的结构
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 初始化可变数据结构中的共享指针向量
- 指向具有 decltype 的函数的指针向量
- push_back指向指针向量的指针
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 我可以做些什么来改进指针向量中的此搜索?
- 指向指针排序向量的指针向量的 C++ 向量
- 初始化用户定义类的指针向量
- 函数无法识别我在C++传递节点指针向量?
- 如何声明指向类对象的指针向量?
- 指向结构的指针向量的元素具有相同的地址
- 删除指向抽象类的指针向量
- 当我返回指向结构的指针向量时出现段错误
- 用基于范围的for循环填充指针向量