2011-02-03 15 views
1

folowingコンストラクタの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'を構築します。 –

答えて

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

この動作はC++標準のバージョンに依存してあなたの標準ライブラリの実装は実装しています:C++ 03では

  • を、これは1つのデフォルトはObjectを構築し、そのオブジェクトの構造をコピーして作成しますn回。 C++ 0X、このデフォルトコンストラクトN Object S内

違いは通常は問題ではありませんが、知っておきましょう。


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

これは、n個のヌルその中Object* sのvectorを作成します。 Object*はクラス型ではなく、コンストラクタを持っていないので、新たに挿入されたオブジェクトは、値がポインタのために、彼らはNULLに設定されている意味し、初期化されます。

あなたが動的に新しいオブジェクトを作成すると、コンテナでそれらへのポインタを保存する場合は、newを自分で呼び出す必要があります。コンテナは尖った-にオブジェクトを所有している場合は、標準ライブラリのコンテナに生のポインタを格納すべきではないことに注意してください。そうすることは例外ではありません。

あなたが(注意:auto_ptrスマートポインタは、このようにshared_ptrまたはunique_ptr、その珍しいコピー・セマンティクスのために容器に保管することはできません使用する必要があります)の代わりにshared_ptrまたはunique_ptrのようなスマートポインタを使用する必要があります。いずれの場合においても

は、容器の中にポインタをn個の異なる、動的に割り当てられたオブジェクトを挿入するために、あなたはそれらのn個のオブジェクトを作成するためにnewを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を出力します。 –

2

folowingコンストラクタ

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

はデフォルトコンストラクタ

はいを​​呼び出して、n個のオブジェクトを作成しますが、既定のコンストラクタは、2番目のオプションのパラメータを構成するためにのみ使用されvectorのコンストラクタ、ベクトル内のnオブジェクトがこのパラメータをコピーすることによって構築されます。 [C++ 03の答え]

あなたが何かやった場合:

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

を使用すると、動的に一つのオブジェクトを割り当て、あなたが望むものはおそらくされていない、あなたのvectorにそのオブジェクトへのnのポインタを持っているでしょう。

そのコンテナが動的に割り当てられたオブジェクトを所有すると想定される場合、ポインタのコンテナを使用することは、ほとんどの場合、悪い考えです。あなたはboost::ptr_vectorのようなものか、スマートポインタのコンテナ(可能であればstd::auto_ptrではない)を考慮する必要があります。

+0

+1の 'ptr_vector'と' auto_ptr'のコメント。 –

0

あなたの最終的なコード例は適切な一般的な考え方を持っていますが、慎重に踏み込んでください:vectorあなたがそうした場合、割り当てを管理してください!例えば、objects.clear()はメモリをリークします。

代わりにstd::vector<some_smart_ptr<Object> >を使用したいと思うかもしれませんが、適切なスマートポインタクラスを選択すると、あるベクトルから別のベクトルに要素をコピーするときに何が起こるかなどに注意を払う必要があります。 boost::shared_ptrは安全な選択ですが、使用するケースに不必要なオーバーヘッドがある可能性があります。 boost::ptr_vectorが良いかもしれません。

+0

'vector'は全く割り当てを行いません。ポインタはnullに初期化されます。 –

+0

OPの最終コードの例(ベクトルを作成し、ループ内で 'new'と' push_back'を呼び出す)は、これを認識していることを明確に示しています。 – zwol

0

いいえ、vectorObjectインスタンスへのポインタで自動的に作成されません。正しく挿入するには、書いたforループを実行する必要があります。

また、これらのオブジェクトの処理が完了したら、それぞれdeleteにする必要があります。

関連する問題