2012-10-17 94 views
2

我想看看我是否能在單行初始化對象的矢量,所以我寫了下面的例子:如何初始化不同對象指針的向量?

vector<Bar*> bar(5, new Bar()); 

bar[3]->hit++; 
for (int i = 0; i < 5; i++) 
    cout << bar[i]->hit << endl; 

但是當我運行它,我得到:

1 
1 
1 
1 
1 

它似乎對所有指針使用相同的新Bar()。是否可以初始化對象指針的向量以指向不同的對象?

+1

你可以使用一些'std :: generate'魔法,但問題是,你爲什麼想要? – avakar

回答

3

所有指針指向相同的位置,所以結果是預期的。

vector<Bar*> bar(5, new Bar()); 

不會創建所有5個對象的新Bar,但使用由new Bar()返回的值,它是一個指向的存儲器位置,以生成矢量。

爲了得到你所期望的結果,你可以使用std::generate

Bar* newBar() { return new Bar(); } 

//... 

vector<Bar*> bar(5); 
std::generate(bar.begin(),bar.end(),newBar); 

或者乾脆

std::generate(bar.begin(),bar.end(), []{return new Bar();}); 

如果C++ 11是一個選項。

這個輸出是

0 
0 
0 
1 
0 
+1

如果滿足這樣的要求,那麼lambda的完美場所:) – chris

+1

@chris okay添加。 :) –

1

初始化向量與幾個不同的值需要C++ 11和初始化列表的支持:

std::vector<Bar*> v { new Bar, new Bar, new Bar, new Bar }; 

你或許可以用像庫Boost.Assign在C++ 11之前的版本中。

+0

對,但請不要只爲此添加Boost到您的應用程序。 :) – karlphillip

+1

@ karlphillip,無論如何你應該加上Boost:P – mauve

+0

@mauve不是真的,當你有'std :: generate'的時候。此外,初始化列表是一個ideea,但它不適用於更大的陣列。想象一下尺寸爲100的數組......然後呢? –

0

從規格:

Effects: Constructs a vector with n copies of value [...] 

其中n是所述第一和值的第二個參數。