如何将元素添加到指针向量中

How to add an element into the vector of pointers?

本文关键字:指针 向量 添加 元素      更新时间:2023-10-16

>我有这个:

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>(总是好的,因为这会为您处理丑陋的内存管理。