5

この情報が見つかりません。ここでは、ループ内にいて、いつでもランダムな情報を取得できるという奇妙な状況に対処しています。この情報はベクトルに格納する必要があります。ここで、各フレームでこのベクトルを設定して、スペースを超えないようにする必要があります (インデックスを使用してベクトル内のランダムな点に値を書き込んでいます)。

このコードを変更する方法がないと仮定すると、正確にベクトルのサイズである引数を送信した場合、ベクトルは resize() 関数を「無視」しますか? この情報はどこで確認できますか?

4

2 に答える 2

9

MSDN リファレンス1から

コンテナーのサイズが要求されたサイズ _Newsize より小さい場合、要求されたサイズに達するまで要素がベクターに追加されます。コンテナーのサイズが要求されたサイズよりも大きい場合、コンテナーがサイズ _Newsize に達するまで、コンテナーの末尾に最も近い要素が削除されます。コンテナーの現在のサイズが要求されたサイズと同じ場合、アクションは実行されません。

ISO C++ 標準(485 ページ2 )では、vector::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

そうです、ベクトルはそれを無視するので、自分でチェックを実行する必要はありません。

于 2012-05-06T20:59:20.023 に答える
0

ちょっとちょっと。

resize() を使用してベクトルのサイズを変更するだけでは、ベクトル自体が使用するメモリが増えるだけです (その要素が使用するメモリ量が変わります)。予約されたスペースに十分なスペースがない場合は、再割り当てされます (そして、彼らは自分自身を少し埋めたいと思っているので、たとえあったとしてもあなたが成長するかもしれません)。要求されたサイズと実行したいパディングに十分なスペースがすでにある場合、再成長しません。

サイズの終わりを過ぎた要素が削除されると仕様に記載されている場合、それはin placeを意味します。基本的に、削除する要素ごとに _M_buff[i].~T() を呼び出します。したがって、デストラクタが機能していると仮定して、オブジェクトが割り当てるメモリはすべて削除されますが、オブジェクト自体が占有するスペース (サイズ) は削除されません。ベクトルは成長し、成長し、指定した最大サイズまで成長し、存在している間は再縮小しません。

于 2012-05-06T21:06:57.833 に答える