2012-02-16 5 views
5

は、私は次のような状況でstd::vector::reserve()の行動を知りたいと思った:行動()メソッド

  1. reserve(N)が複数回すぐに次々と呼ばれていると仮定します。 先にreserve(N1)が追加または上書きされますか?
  2. 以前のreserve(N1)が最新のコールで上書きされた場合、 最新のreserve(Nn)のスロット数が少ない場合はどうなりますか?
  3. push_back() X要素の場合はvectorと宣言した後、 とし、reserve(N)とします。すでにpush_back() X の要素はNに数えられますか?
  4. vectorがある場合と仮定、いくつかのXは、要素をプッシュして、私たちは push_back() 1つの以上の要素(X + 1)は、そのオブジェクトが に持っているならば、今移転します。まだpush_back()を実行していません。 reserve()と今すぐ電話すると、 はどうなりますか?オブジェクトはすぐに に再配置されますか?そうでない場合、スペースはどのように予約されていますか?
+0

標準のコピーをお持ちでない場合は、[複数](http://www.sgi.com/tech/stl/Vector.html)[references](http:// en.cppreference.com/w/cpp/container/vector/reserve)オンライン。 –

答えて

11

reserve()だけベクトルの割り当てられたメモリが少なくとも、引数として渡されたアイテムの数を収容するのに十分な大きさであることを確認します。したがって...

  1. いずれの場合も、通過するすべての値の最大値は、有効に予約された最小の結果容量になります。
  2. #1を参照してください。
  3. はい。
  4. reserve()に渡されたアイテムの数を格納するために必要なので、reserve()が呼び出されたときに、ベクトルは多くのメモリを割り当てます。

実際の規格から引用すると:

void reserve(size_type n) 

nは以下capacity()に等しい場合、この呼び出しは効果がありません。 それ以外の場合は、追加メモリの割り当て要求です。 要求が成功した場合、capacity()n以上です。 以外の場合、capacity()は変更されません。どちらの場合も、size()は変更されずに です。

+1

+1再割り当てが発生した場合( 'n'>' capacity() ')にも注意してください。イテレータ、ポインタ、およびそのベクトルへの参照は無効になります。これを念頭において、 'reserve()'は 'push_back()'が呼び出されたときに実際に*再割り当て*(したがってイテレータの無効化など)を防ぐために特に便利です。 – netcoder

+2

#1が不正確です:少なくともreserve_()と同じくらいの結果が_capacity_(サイズではありません)が最大の要求を持つ 'reserve() 'の呼び出しより大きい可能性があることを意味します。 – wilhelmtell

+0

"結果のサイズ" - > "結果の最小サイズ"を編集しました。 – Amber

3

reserve(N)が複数回すぐに次々と呼ばれていると仮定します。以前のreserve(N1)は、追加または上書きされますか?

std::stringとは異なり、現在capacity()未満である引数とcapacity() .Calling reserve()を縮小するstd::vectorためreserve()を呼び出すことができない何もしません。したがって、現在の容量を増加させる最後のreserve()コールが良好に保たれます。

reserve(N1)以前は、最新の呼び出しで上書きされます場合は、最新のreserve(Nn)スロットの少ない数を要求する場合、その後、何が起こりますか?

現在のcapacity()よりも小さい引数を持つreserve()を呼び出すことは、何もしません。

単純にpush_back()X要素があればvectorを宣言してから、reserve(N)を呼び出します。既にpush_back()X要素はNでカウントされますか?

reserve()これだけ割り当て(予約)の要素の十分な数をはい。 reserve()を呼び出した後、ベクトルのcapacity()のみが変更されます。size()は影響を受けません。メモリを予約するだけでなく、多くの要素を作成する必要がある場合は、resize()を使用する必要があります。

と仮定、ベクトルは、いくつかのXの要素をプッシュしている場合、今、私たちはpush_back() 1つの以上の要素(X+1)、そのオブジェクトが再配置されたりしなければならない場合。まだpush_back()を実行していません。 reserve()に今すぐ電話するとどうなりますか?オブジェクトはすぐに再配置されますか?そうでない場合、スペースはどのように予約されていますか?

はい、移転が起こるのだろうが、それは依存します。前述のように、reserve()は、渡された引数と同じ数の要素を格納するのに十分なメモリを割り当てます。したがって、この要素の数が現在のベクトルcapacity()に収まるものより大きい場合、再配置が行われます。

標準的な参考文献:
C++ 03 23.2.4.2ベクトル容量[lib.vector.capacity]

void reserve(size_type n);

効果:のベクトルを通知指令計画されたサイズの変更により、それに応じてストレージの割り当てを管理することができます。 reserve()の後、再割り当てが発生した場合、capacity()はreserveの引数より大きいか等しいです。それ以外の場合は前の値capacity()に等しくなります。現在の容量がreserve()の引き数より小さい場合に限り、再割り当てがこの時点で行われます。

複雑さ:シーケンスのサイズは変更されず、シーケンスのサイズで最も線形な時間がかかります。

例外: length_error n > max_size() 0.248場合)

再配置は、配列の要素を参照するすべての参照、ポインタ、反復子を無効にします。reserve()への呼び出し後に発生する挿入中に、挿入によりベクトルのサイズが最新の呼び出しで指定されたサイズより大きくなるまで、再割り振りは行われないことが保証されています(reserve())。

+0

良い答え..すでに両方の答えに+1。 – iammilind

関連する問題