2013-03-12 28 views
3

我有這樣的:如何將元素添加到指針向量中?

std::vector <BinaryTree*> children;

其中BinaryTree是一個類。我怎樣才能添加一個元素到這個矢量?

我試圖children.push_back(X)其中X是類的實例,但它給了我這個錯誤:

cannot convert parameter 1 from 'BinaryTree' to 'BinaryTree *&&'

+0

如何將BTreeNode ** C轉換爲向量 – user765443 2017-10-29 16:49:42

回答

9

只需使用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); 
+0

值得注意的是'std :: shared_ptr'是C++ 11的一個特性。 – LihO 2013-03-12 21:15:59

+0

'BinaryTreee * = make_shared(...)'不會工作。 – mfontanini 2013-03-12 21:17:05

+0

@LihO不是真的,'shared_ptr'在C++ 03下可用作'std :: tr1 :: shared_ptr' – Praetorian 2013-03-12 21:17:47

1
std::vector<SomeObject*> objectVector; 
objectVector.push_back(new SomeObject()); 

我是如何做到這一點。

3

從模板參數忽略星號*數據,無需手動/動態內存分配,如new BinaryTree

+0

你絕對**不想這樣做。正確的方法是在容器中保留指針。 – 2013-03-12 21:13:36

+1

@Cthulhu,感謝您的編輯,我寫了「asterix」多年。正如維基百科所說:「不要與Asterix混淆。」 :-) – kay 2013-03-12 21:15:23

+2

@arrows是如此錯誤,這是有趣的。 – juanchopanza 2013-03-12 21:15:33

0

你有一個指針的向量:

std::vector <BinaryTree*> children; 

因此添加元素的正確方法是:

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

只是要小心,在做這樣的事情:

{ 
    BinaryTree child; 
    children.push_back(&child); 
} 

因爲這樣一個元素的生命週期可能比矢量的生命週期更短,你最終可能會試圖交流插入一個不再存在的元素(懸掛指針),它會產生未定義的行爲。這些元素在完成時也不要忘記delete

但是,首先考慮使用對象向量(即std::vector<BinaryTree>)總是不錯的,因爲這會爲您處理這種醜陋的內存管理。

2

這真的取決於誰應該擁有指針。在最簡單的情況下,矢量不擁有它們,然後傳遞一個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; 
+0

'BinaryTree b + ...;''......'應該是什麼? – kay 2013-03-12 21:12:52

+0

@Kay它應該是一個'='。我無法打字。 – juanchopanza 2013-03-12 21:14:36

0
children.push_back(&X); 

這是可行的,但要記住,一旦你的對象離開範圍,其缺失者將被調用,你將被留下一個無效的指針。

0
children.push_back(&X); 

傳遞地址,就好像您將它用作指針一樣。但問題是,然後如果該實例超出範圍,所以更好地做到這一點

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

這將確保X永不熄滅的範圍,但你必須手動刪除它,當你與完成它。

0

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); 

現在,您不必擔心在清空矢量之前刪除對象。

相關問題