我想看看我是否能在單行初始化對象的矢量,所以我寫了下面的例子:如何初始化不同對象指針的向量?
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()。是否可以初始化對象指針的向量以指向不同的對象?
我想看看我是否能在單行初始化對象的矢量,所以我寫了下面的例子:如何初始化不同對象指針的向量?
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()。是否可以初始化對象指針的向量以指向不同的對象?
所有指針指向相同的位置,所以結果是預期的。
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
如果滿足這樣的要求,那麼lambda的完美場所:) – chris
@chris okay添加。 :) –
初始化向量與幾個不同的值需要C++ 11和初始化列表的支持:
std::vector<Bar*> v { new Bar, new Bar, new Bar, new Bar };
你或許可以用像庫Boost.Assign在C++ 11之前的版本中。
對,但請不要只爲此添加Boost到您的應用程序。 :) – karlphillip
@ karlphillip,無論如何你應該加上Boost:P – mauve
@mauve不是真的,當你有'std :: generate'的時候。此外,初始化列表是一個ideea,但它不適用於更大的陣列。想象一下尺寸爲100的數組......然後呢? –
從規格:
Effects: Constructs a vector with n copies of value [...]
其中n是所述第一和值的第二個參數。
你可以使用一些'std :: generate'魔法,但問題是,你爲什麼想要? – avakar