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

C++ 如何将元素添加到指针向量中?,c++,pointers,vector,C++,Pointers,Vector,我有这个: std::向量子类 其中,BinaryTree是一个类。如何将元素添加到此向量中 我尝试了children.push_back(X)其中X是该类的一个实例,但它给了我以下错误: 无法将参数1从“BinaryTree”转换为“BinaryTree*&&” std::vector objectVector; objectVector.push_back(newsomeobject()); 就是这样做的。只需使用push_back()并传递一个指向二进制树的实例的指针即可: std::v

我有这个:

std::向量子类

其中,
BinaryTree
是一个类。如何将元素添加到此向量中

我尝试了
children.push_back(X)
其中
X
是该类的一个实例,但它给了我以下错误:

无法将参数1从“BinaryTree”转换为“BinaryTree*&&”

std::vector objectVector;
objectVector.push_back(newsomeobject());

就是这样做的。

只需使用
push_back()
并传递一个指向
二进制树的实例的指针即可:

std::vector <BinaryTree*> children;
BinaryTree* pTree = new BinaryTree();
children.push_back(pTree);
...
delete pTree;
std::向量子类;
BinaryTree*pTree=新的BinaryTree();
儿童。推回(P树);
...
删除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::vector <BinaryTree*> children;
\include//For std::shared\u ptr
性病媒儿童;
std::shared_ptr pTree=std::make_shared();
儿童。推回(P树);
...
//不需要删除pTree
std::shared_ptr
类模板是C++11标准库的一部分。在C++03中,您可以使用(几乎)等效的
boost::shared\u ptr

\include//For std::shared\u ptr
性病媒儿童;
boost::shared_ptr pTree=boost::make_shared();
儿童。推回(P树);
...
//不需要删除pTree

最后,如果你根本不需要引用语义,而是想把二进制树当作值来处理,你甚至可以考虑定义<代码> STD::vector < /C> >:

std::向量子类;
二叉树;
孩子们。推回(树);

从模板参数中省略星号
*

std::vector<BinaryTree> children;
std::vector<BinaryTree> children;
std::向量子类;

您希望子级保存数据,而无需手动/动态内存分配,如
新建二进制树

您有指针向量:

#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::vector <BinaryTree*> children;
做这样的事情时要小心:

{
    BinaryTree child;
    children.push_back(&child);
}
因为这样一个元素的生存期可能比向量的生存期短,并且您可能最终尝试访问一个不再存在的元素(悬空指针),从而产生未定义的行为。另外,使用完后,不要忘记删除这些元素


但是首先考虑使用对象的向量(即<代码> STD::vector < /代码>),因为这会照顾到你的丑陋内存管理。

它实际上取决于谁应该拥有指针。在最简单的情况下,如果向量不拥有它们,则传递

BinaryTree
对象的地址

BinaryTree b = ...;
children.push_back(&b);
但是你必须确保
b
至少和
孩子的寿命一样长

如果向量拥有指针,那么您可能应该存储智能指针,以避免处理内存管理:

std::vector<std::unique_ptr<BinaryTree>> children;
children.push_back(std::unique_ptr<BinaryTree>(new BinaryTree(args)));
std::向量子类;
push_back(std::unique_ptr(新的二进制树(args));
如果您不知道所有这些“所有权”业务意味着什么,那么您最好使用简单的对象向量:

std::向量子类;
这将起作用,但请记住,一旦对象离开作用域,它的deleter将被调用,剩下的指针将无效

children.push_back(&X);
传递地址,就像将其用作指针一样。但问题是,如果该实例超出范围,那么最好这样做

BinaryTree* X = new BinaryTree;
children.push_back(X);

这将确保X永远不会超出范围,但在使用完它后,您必须手动删除它。

向量包含指向类型为
二进制树的对象的指针。你需要

BinaryTree bt;
children.push_back( &bt );
但必须确保
bt
对象的生存期至少与
向量的生存期相匹配

你可能想要这个

children.push_back( new BinaryTree );
但在这种情况下,必须对
向量中包含的指针调用
delete
,以防止内存泄漏

显然,这两种选择都不容易管理。一个简单的更改是让容器按值存储元素

std::vector<BinaryTree> children;
BinaryTree bt;
children.push_back( bt );
std::向量子类;
二叉树;
儿童。推回(bt);
如果必须存储指针,请使用智能指针来保存它们

std::vector<std::unique_ptr<BinaryTree>> children;
children.push_back( new BinaryTree );
std::向量子类;
儿童。推回(新二进制树);

现在,您不必担心在清空向量之前删除对象。

您肯定不想这样做。正确的方法是将指针保存在容器中。@Cthulhu,谢谢你的编辑,我写了“asterix”很多年了。正如维基百科所说:“不要与Asterix混淆。”:-)@arrows
template-struct-BinaryTree{T-value;BinaryTree*left,*right;}
?@juanchopanza当你真正实现它时,它将不再有趣,只要试试它。@arrows我们对
BinaryTree
一无所知,并且只能猜测此向量的作用。值得注意的是,
std::shared_ptr
是C++11的功能。@LihO不太可能,
shared_ptr
在C++03下作为
std::tr1::shared_ptr
children.push_back( new BinaryTree );
std::vector<BinaryTree> children;
BinaryTree bt;
children.push_back( bt );
std::vector<std::unique_ptr<BinaryTree>> children;
children.push_back( new BinaryTree );