2011-02-03 73 views
1

如下因素構造的std ::向量,構造,對象

std::vector<Object> objects(n); 

創建n個對象調用默認的構造函數,即類似的東西:

std::vector <Object> objects; 
for (unsigned int i = 0; i < n; i++) objects.push_back(o); 

是此過程也適用於動態分配對象?施工

std::vector<Object *> objects(n); 

代表此功能?

std::vector <Object*> objects; 
for (unsigned int i = 0; i < n; i++) objects.push_back(new Object()); 

如果沒有,有沒有辦法如何安排它?

+0

僅供註釋:除了每個`push_back()`重新分配向量的內部緩衝區之外。構造一個傳遞元素個數的vector,緩衝區被分配一次。 – 2011-02-03 22:31:00

回答

6
std::vector<Object> objects(n); 

的這種行爲取決於哪一個版本的C++標準你的標準庫實現實現的:

  • 在C++ 03,這將創建一個默認的構造Object,然後複製對象構造n次。

  • 在C++ 0x中,此缺省構造函數爲Object s。

差異通常不重要,但很好知道。


std::vector<Object *> objects(n); 

這將創建具有n個空Object*,它出現一個vector。由於Object*不是類類型,也沒有構造函數,所以新插入的對象是初始化的值,對於指針來說,它們被設置爲NULL

如果要動態創建新對象,然後將指針存儲在容器中,則需要自行撥打new。請注意,如果容器擁有指向對象,則不應將原始指針存儲在標準庫容器中。這樣做並不是特例安全。

您應該使用智能指針像shared_ptrunique_ptr代替(注:auto_ptr智能指針不能被儲存在容器中,由於其不尋常的拷貝語義,從而shared_ptrunique_ptr應使用)。

在任何情況下,要將指向n個不同的,動態分配的對象的指針插入到容器中,您需要調用new n次來創建這n個對象。您的for環路解決方案沒有任何問題。

+0

一個很重要的例子是struct dumb {int i;愚蠢(){靜態INT J = 0; i = j ++; }}; int main(void){std :: vector v(2); std :: cout << v [1] .i << std :: endl; }`這將在C++ 03中打印0,而在C++ 0x中打印1。 – 2011-02-03 22:37:31

2

如下因素構造

std::vector<Object> objects(n); 

創建n個對象調用默認的構造函數

是的,但默認構造函數僅用於建造第二個可選參數的構造函數vector,n中的對象是通過複製此參數構造的。 [C++ 03回答]

如果你不喜歡的東西:

std::vector<Object*> objects(n, new Object()); 

你會動態分配一個對象,並有n指向該物體在你的vector這可能不是你想要的。

如果容器應該擁有動態分配的對象,那麼使用指針容器幾乎總是一個壞主意。你應該考慮類似boost::ptr_vector,或者如果這是不可能的智能指針的容器(不是std::auto_ptr,雖然)。

+0

對於`ptr_vector`和`auto_ptr`備註+1。 – 2011-02-03 22:32:08

0

您的最終代碼示例有正確的總體思路,但要謹慎行事:vector而不是如果您這樣做,爲您管理分配!例如,objects.clear()會泄漏內存。

您可能希望使用std::vector<some_smart_ptr<Object> >來代替,但是選擇正確的智能指針類需要注意(例如)將元素從一個向量複製到另一個時發生的情況。 boost::shared_ptr是一個安全的選擇,但可能會對您的用例造成不必要的開銷。 boost::ptr_vector可能會更好。

+0

`vector`根本不會做任何分配,指針會被初始化爲空值。 – 2011-02-03 22:31:41

0

不,不會自動創建vector指針,指向Object實例。您將不得不執行您編寫的for循環才能正確填充它。

當您完成這些對象時,您還需要使用delete這些對象中的每一個。