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混淆。”:-)@arrowstemplate-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 );