我有這樣的:如何將元素添加到指針向量中?
std::vector <BinaryTree*> children;
其中BinaryTree
是一個類。我怎樣才能添加一個元素到這個矢量?
我試圖children.push_back(X)
其中X
是類的實例,但它給了我這個錯誤:
cannot convert parameter 1 from 'BinaryTree' to 'BinaryTree *&&'
我有這樣的:如何將元素添加到指針向量中?
std::vector <BinaryTree*> children;
其中BinaryTree
是一個類。我怎樣才能添加一個元素到這個矢量?
我試圖children.push_back(X)
其中X
是類的實例,但它給了我這個錯誤:
cannot convert parameter 1 from 'BinaryTree' to 'BinaryTree *&&'
只需使用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;
你想把孩子抱:
std::vector<BinaryTree> children;
BinaryTree tree;
children.push_back(tree);
值得注意的是'std :: shared_ptr'是C++ 11的一個特性。 – LihO 2013-03-12 21:15:59
'BinaryTreee * = make_shared(...)'不會工作。 – mfontanini 2013-03-12 21:17:05
@LihO不是真的,'shared_ptr'在C++ 03下可用作'std :: tr1 :: shared_ptr' – Praetorian 2013-03-12 21:17:47
std::vector<SomeObject*> objectVector;
objectVector.push_back(new SomeObject());
我是如何做到這一點。
從模板參數忽略星號*
數據,無需手動/動態內存分配,如new BinaryTree
。
你絕對**不想這樣做。正確的方法是在容器中保留指針。 – 2013-03-12 21:13:36
@Cthulhu,感謝您的編輯,我寫了「asterix」多年。正如維基百科所說:「不要與Asterix混淆。」 :-) – kay 2013-03-12 21:15:23
@arrows是如此錯誤,這是有趣的。 – juanchopanza 2013-03-12 21:15:33
你有一個指針的向量:
std::vector <BinaryTree*> children;
因此添加元素的正確方法是:
BinaryTree* child = new BinaryTree();
children.push_back(child);
只是要小心,在做這樣的事情:
{
BinaryTree child;
children.push_back(&child);
}
因爲這樣一個元素的生命週期可能比矢量的生命週期更短,你最終可能會試圖交流插入一個不再存在的元素(懸掛指針),它會產生未定義的行爲。這些元素在完成時也不要忘記delete
。
但是,首先考慮使用對象向量(即std::vector<BinaryTree>
)總是不錯的,因爲這會爲您處理這種醜陋的內存管理。
這真的取決於誰應該擁有指針。在最簡單的情況下,矢量不擁有它們,然後傳遞一個BinaryTree
對象的地址。
BinaryTree b = ...;
children.push_back(&b);
但是你必須要相信只要children
確實至少b
生活。
如果向量擁有指針,那麼你或許應該存儲智能指針,以避免必須處理內存管理軟件:
std::vector<std::unique_ptr<BinaryTree>> children;
children.push_back(std::unique_ptr<BinaryTree>(new BinaryTree(args)));
如果你不知道這一切的「所有權」的經營方式,然後你是最有可能的對象的純矢量更好:
std::vector<BinaryTree> children;
'BinaryTree b + ...;''......'應該是什麼? – kay 2013-03-12 21:12:52
@Kay它應該是一個'='。我無法打字。 – juanchopanza 2013-03-12 21:14:36
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);
現在,您不必擔心在清空矢量之前刪除對象。
如何將BTreeNode ** C轉換爲向量 – user765443 2017-10-29 16:49:42