2012-05-06 5 views
5

この情報は見つかりませんでした。私はここで私がループの中にいる奇妙な状況に対処しており、いつでもランダムな情報を得ることができます。この情報はベクトルに格納する必要があります。今は各フレーム私はスペースをexeedしないことを保証するためにこのベクトルを設定する必要があります(私はインデックスを使用してベクトル内のランダムな点に値を書きます)。STLのベクトルサイズ変更

このコードを変更する方法がないとすれば、ベクトルのサイズとまったく同じ引数を送信すると、ベクトルはresize()関数を "無視"しますか?この情報はどこにありますか? MSDN参照から

答えて

9

1

コンテナのサイズは、要求されたサイズより小さい場合、それは要求されたサイズに達するまで、_Newsizeは、要素がベクターに付加されています。コンテナのサイズが要求されたサイズより大きい場合、コンテナが_Newsizeサイズに達するまで、コンテナの最後に最も近い要素が削除されます。コンテナの現在のサイズは、要求されたサイズと同じである場合は、アクションはISO C++標準(ページ485 2vector::resize

void resize (size_type sz , T c = T()); 

if (sz > size()) 
    insert (end() , sz - size() , c); 
else if (sz < size()) 
    erase (begin()+ sz , end()); 
else 
; // Does nothing 

ため、この動作を指定し

を取られませんそう、はい、ベクトルはそれを無視し、自分でチェックを行う必要はありません。

0

金田そば。

resize()でベクトルのサイズを変更するだけで、ベクトル自体によって多くのメモリが使用されます(その要素によってどれだけ使用されるかが変わります)。予約されたスペースに十分なスペースがない場合、それは再割り当てされます(そして、あなたが成長するかもしれないとしても、時には自分自身を少し詰め込むことを好みます)。要求されたサイズのために余裕があり、どんなパディングをしたい場合でも、それは再開しません。

仕様は、サイズの終わり過去の要素が削除されることを言うとき、それは場所にを意味します。基本的には、削除する要素ごとに_M_buff [i]。〜T()を呼び出します。したがって、あなたのオブジェクトが割り当てたメモリはであり、動作するデストラクタを前提として削除されますが、オブジェクト自体が占めるスペース(サイズ)は削除されません。ベクターは成長し、成長し、あなたがそれまで伝えた最大のサイズに成長し、存在する間に再飲酒しません。