2011-01-22 8 views
1

私はnode_objが[ノード] .c_max> 0(Iがチェックされる)、このSTLベクトル予備

vector<int> tmp_color; tmp_color.reserve(node_obj[node].c_max); 
    for(int tmp_color_idx = 0; tmp_color_idx < node_obj[node].c_max; tmp_color_idx++) 
     tmp_color[tmp_color_idx] = tmp_color_idx; 

ように整数のベクトルを事前に割り当てることを試みていました。 tmp_colorのサイズは、forループの後にとにかくゼロに見えます。コードに何か問題があれば?

おかげ

答えて

2

あなたは、私は次のように示唆書いたようにループ内で割り当てを作成する場合:あなたはそれがクラッシュしなかったことを、むしろ幸運です

vector<int> tmp_color(node_obj[node].c_max); 
for(int tmp_color_idx = 0; tmp_color_idx < node_obj[node].c_max; tmp_color_idx++) 
    tmp_color[tmp_color_idx] = tmp_color_idx; 
+0

+1これはおそらく著者が意図したものです。 – StackedCrooked

3

reserveは、実際にvectorに要素を追加しません。それはresizeのことです。 reserveはスペースを確保するだけです。あなたのいずれかを使用して、あなたのループで一つ一つの要素を追加する必要があります。

tmp_color.push_back(tmp_color_idx); 

のかresizereserveの使用を変更します。

+2

つまり、 'reserve()'はベクトルの** capacity **を変更し、 'resize()はベクトルの** size **を変更します。 ** size **は、ベクトルに実際に存在する初期化された*要素の数を示し、** capacity **は、新しい要素が追加されるときに再割り当てが必要になるまで保持できる要素の最大数を示します。サイズは常に容量以下です。 –

1

を。

tmp_color[tmp_color_idx] = tmp_color_idx; 

上記の行では、ベクトルの範囲外にアクセスしています。

reserve()はベクトルのサイズを増やさず、resize()を使用します。 Elalferが使用する方法は、サイズをあらかじめ割り当てる方がはるかに優れています。

+0

@In silico:Visual studio implを見ると、オーバーロードされた添字演算子はmax_size()に対してではなく、size()に対してチェックします。 reserve()呼び出しはmax_size()を更新するだけで、size()は更新しません。したがって、operator []が呼び出されるとクラッシュします。 – bjskishore123

+0

申し訳ありませんが、私はElalferの答えを読んでいましたが、OPの質問ではありませんでした。 –

関連する問題