2

オブジェクトのベクトルを1行で初期化できるかどうかを確認したかったので、次の例を作成しました。

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()を使用しているようです。異なるオブジェクトを指すようにオブジェクトポインタのベクトルを初期化することは可能ですか?

4

3 に答える 3

3

すべてのポインターが同じ場所を指しているため、結果は期待どおりです。

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

Bar5 つのオブジェクトすべてに対して新しい を作成するのではなく、によって返される値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
于 2012-10-17T19:16:07.847 に答える
1

複数の異なる値でベクトルを初期化するには、C++11 と初期​​化子リストのサポートが必要です。

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

C++11 より前のバージョンでは、おそらく Boost.Assign のようなライブラリを使用できます。

于 2012-10-17T19:18:12.217 に答える
0

仕様から:

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

ここで、n は最初の引数で、value は 2 番目の引数です。

于 2012-10-17T19:23:14.130 に答える