43

resize(n)C++ 標準では、 、 with n < size()、または のいずれかによる容量への副作用については何も述べていないよう clear()です。

push_backとの償却コストについてのステートメントを作成しますpop_back- O(1)

通常の種類の容量変更を CLRS アルゴリズムで行う実装を想像できます (例: 拡大すると 2 倍になり、縮小すると半分になりsize to < capacity()/4ます)。(Cormen Lieserson Rivest Stein)

実装の制限についての参照はありますか?

4

4 に答える 4

56

resize()小さいサイズで呼び出しても、 の容量には影響しませんvector。メモリを解放しません。

a からメモリを解放するための標準的なイディオムはvectorswap()空の一時的なvector:を使用することですstd::vector<T>().swap(vec);。下方にサイズ変更する場合は、元のベクターから新しいローカル一時ベクターにコピーしてから、結果のベクターを元のベクターと交換する必要があります。

更新: C++11 は、shrink_to_fit()この目的のためにcapacity()メンバー関数を追加しましたsize()

于 2009-07-20T20:14:57.030 に答える
30

実際、標準では何が起こるべきかを指定しています。

これは からvectorのものですが、テーマはすべてのコンテナ ( listdeque、など...)で同じです。

23.2.4.2 ベクトル容量 [lib.vector.capacity]

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

6) 効果:

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

つまり、指定されたサイズresizeが要素の数よりも小さい場合、それらの要素はコンテナーから消去されます。に関してcapacity()は、これは何をするかによって異なりerase()ます。

clear()標準で見つけることはできませんが、次のように定義されていると確信しています。

void clear()
{
    erase(begin(), end());
}

したがって、それに対する効果clear()は、それcapacity()に対する効果にも結び付けられerase()ます。標準によると:

23.2.4.3 ベクトル修飾子 [lib.vector.modifiers]

iterator erase(iterator position);
iterator erase(iterator first, iterator last);

4) 複雑さ: T のデストラクタは、消去された要素の数に等しい回数呼び出されます....

これは、要素が破壊されることを意味しますが、メモリはそのまま残ります。erase()は容量に影響しないためresize()clear()も影響もありません。

于 2009-07-20T20:16:32.660 に答える
7

容量が減ることはありません。標準がこれを明示的に述べているかどうかはわかりませんが、暗示されています。イテレータとベクトルの要素への参照は、resize(n)ifによって無効にしてはなりませんn < capacity()

于 2009-07-20T20:36:03.573 に答える
0

私がgcc(mingw)をチェックしたとき、ベクトル容量を解放する唯一の方法はmattnewportの言うことです。他の一時的なベクトルと交換します。このコードは gcc 用になります。

template<typename C> void shrinkContainer(C &container) {
    if (container.size() != container.capacity()) {
        C tmp = container;
        swap(container, tmp);
    }
    //container.size() == container.capacity()
}
于 2011-10-20T12:00:41.693 に答える