2011-11-14 11 views
3

私は今、vectorと働いています。私は助けが必要な面白い状況があります。C++ベクトル内のベクトルの動的割り当て?

私は次のように定義ベクトルのベクトル、持っている:私は0(ゼロ)を得るとき、私はint型の新しいベクトルを作成したいcin >> helpVar;と毎回を使用して、標準入力から数字をロードしています

vector< vector<int> > list; 

を、どのこの「メインコンテナ」listに入れられます。

もちろん、私は分かりません。数字が何回表示されるかは、ユーザーによって異なります。だから私はまた、プログラムがどのくらいのベクトルを追加するかわからない。

しかし、私は正確にそれを行う方法はわかりません。

if(helpVar == 0) 
{ 
    list.push_back(new vector<int>); 
} 

をしかし、この構造は、C++では動作しません:私はC#や他のガベージコレクションのような言語を使用した場合、私はおそらくちょうど書くでしょう。

私の質問は、この状況をどのように処理して機能させるべきかということです。それとも、私はそれについて間違っていると思いますか?それは別の方法で行われるべきですか?

お返事ありがとうございます。

+0

ベクトルのポインタがあればベクトルがあれば、それは正常に機能します。それは単に慣用的ではありません。 – delnan

+0

これを行うときにメモリリークの危険があることに注意してください。参照してください:http://stackoverflow.com/questions/307082/cleaning-up-an-stl-list-vector-of-pointers – Raedwald

+0

@delnanこれは実際には悪いアドバイスです。できればいつでも新しいものを避けてはいけません。そうすることはしばしば高価になる可能性があるためです。それぞれの言語構造には利点がありますので、それらを賢明に使い、 "常に"ルールを忘れてください。 –

答えて

7
list.push_back(vector<int>()); 

vector<int>()一時vector<int>オブジェクトを作成し、それを初期化する(すなわち、そのオブジェクトのデフォルト・コンストラクタ呼び出し)。 push_backはその一時オブジェクトをlistにコピーします。

C#(および「その他のガベージコレクション言語」)では、newを使用して、ライフサイクルがガベージコレクタによって制御される新しいオブジェクトを作成します。

C++では、newは、オブジェクトを動的に割り当てるためにのみ使用されます(また、スマートポインタを使用して寿命を管理する必要があります)。テンポラリオブジェクトを作成するには、T()Tがタイプの名前です)という構文を使用します。

+1

現代のC++では、オーバーヘッドとタイピングを最小限に抑えるために 'list.emplace_back()'と言うこともできます。 –

1

あなたは

list.push_back(vector<int>()); 

初めに、

list.back().push_back(helpVar); 

を行うことによって、最新のベクトルにhelpVarを追加し、0を得るときちょうど戻ってまだ新しいベクトルをプッシュすることができます。 Cでは

1

++あなただけ行うことができます。

x.push_back(T); 

メモリ管理は、クラス自体によって行われます。私はあなたが正しいことを理解したと思います。

プッシュバックしているクラスにデフォルトのコンストラクタが宣言されている場合は、探す必要があることがあります。

1

あなたは「新しい」と言う場合だけ

list.push_back(vector<int>()); 

を行うには、ヒープ内のスペースを求めているが、あなたはそれを必要としません。すでに外側のベクトルにスペースが予約されています。ベクトルオブジェクト(ポインタではない)を押すだけで完了します!

アドバンスト:この実際にはは、まず外側のベクトルに新しいベクトルを作成してサイズを1ずつ増やしてから、新しい一時ベクトルをスタックに作成してから、そうするために)最初のスタックに移動し、スタック内の一時的なベクトルを破棄します。しかし、コンパイラはこれを完全に最適化するでしょう! C++ 11では

3

:C++ 03では

list.emplace_back(); 

list.push_back(std::vector<int>()); 

newは、オブジェクトを動的に割り当て、それをあなたにポインタを与えます。 vector::push_back()は、の参照をコピーしてコピーします。オブジェクトを自分で動的に割り当てる場合は、newを使用してください。コンテナを使用している場合は不要です。 newを使用するときは、スマートポインタ(または非常に慎重に書かれたコード)を使用して終了したら削除するようにしてください。

関連する問題