2011-09-22 11 views
9

こんにちは、すべての要素をゼロベクトルに初期化したいのですが、要素がサイズのベクトル、例えば5であるサイズ9のベクトルを初期化したいとします。ベクトルのベクトルを初期化する<doubles> C++

この方法は正しいですか?

vector<double> z(5,0); 

vector< vector<double> > diff(9, z); 

または、これを行うには、これより短い方法がありますか?

+1

これは、2Dベクトルを作成する正しい方法です。あなたはもう少し冗長になっているだけです。 –

+2

この9x5サイズは固定ですか? –

+0

はい手前のサイズを知っています。ちょうど9と5を選択して、この質問のためにいくつかのランダムなintとする。 – smilingbuddha

答えて

12

あなたが潜在的に単一のラインでこれを行うことができます:

vector<vector<double> > diff(9, vector<double>(5)); 

あなたはまた、より効率的なストレージおよびアクセスのためのboost::multi_arrayを使用して検討する必要があります(これは、ダブルポインタの間接化を避けます)。

+1

また、アクセスをストライドした45個の要素のベクトルでも十分です。 –

+2

'ベクトル(5)'で十分です。第2引数が '0'である限り、'ベクトル(5、0) 'は必須ではありません。 – Nawaz

4

これは動作しますかなり確信して:あなたは1行にすべてを置くことができます

vector< vector<double> > diff(9, vector<double>(5,0)); 
5

は:

vector<vector<double>> diff(9, vector<double>(5)); 

これは、未使用のローカル変数を回避します。 (あなたがスペース、> >を残しておく必要があり、プリC++ 11のコンパイラで。)

+0

シンタックスの '' 'を注意してください。コンパイラの中には、これらのシンボルの間にスペースが必要なものがあります。 – riwalk

+3

@ Stargazer712これらのコンパイラはもはや準拠していません! :P –

+2

@ R.MartinhoFernandes、適合かどうか、それらは存在します:) – riwalk

5

vector< vector<double> > diff(9, std::vector<double>(5, 0));

ただし使用できるサイズはコンパイル時に知られている特定のケースでC列:

double diff[9][5] = { { 0 } };

4

サイズが固定されている場合は、代わりにstd::arrayに行くことができます:

std::array<std::array<double,5>,9> diff = {}; 
+1

また、エクステントの大きさによっても異なります。 'std :: array'はすべてをローカルスコープに保持します。その配列が大きすぎると、私の名前をエスケープするエラーが発生します。 –

+0

スタックオーバーフロー? –

関連する問題