4

(この質問はshrink_to_fitトリックに関するものではありません (swap()またはshrink_to_fit()C++11 を使用)。)

insert()erase()push_back()、 、 、 、 、pop_back()、のみでベクトルを使用するとclear()、容量が不足すると容量が増え、ベクトルの再割り当てが発生します。しかし、どのような状況で容量が減少するのでしょうか? また、容量の削減は必然的に再割り当てを引き起こしますか?

4

4 に答える 4

9

標準では、参照/イテレータが無効化されないことが保証されていますpop_back。[container.requirements.general] から:

特に指定されていない限り (明示的に、または他の関数に関して関数を定義することによって)、コンテナー メンバー関数を呼び出したり、コンテナーをライブラリー関数への引数として渡したりしても、そのコンテナー内のオブジェクトのイテレーターを無効にしたり、その値を変更したりしてはなりません。 .

そして、それ以外の仕様はありませんpop_back

つまり、再割り当てが発生しないことを意味します。1


1.別の回答へのコメントで、おそらくポップされた要素に対応するメモリを解放できることが示唆されています。これにより、「ライブ」要素への参照が無効になることはありません。

ただし、標準では、サイズが容量を超えるまで挿入によって再割り当てを引き起こすことはできないと具体的に述べているため、それでは配列の再成長が妨げられます。[vector.capacity] から:

の呼び出しの後に挿入が行われている間reserve()は、挿入によってベクトルのサイズが の値よりも大きくなるまで、再割り当てが行われないことが保証されていますcapacity()

于 2012-05-21T15:13:22.507 に答える
5

いいえ、pop_back()しません。他の人は確かにそうではありません。唯一の方法は、あなたが言及した方法です。

template< typename T, class Allocator >
void shrink_capacity(std::vector<T,Allocator>& v)
{
   std::vector<T,Allocator>(v.begin(),v.end()).swap(v);
}

そしてshrink_to_fit()c ++ 11で

于 2012-05-21T14:52:32.370 に答える
0

使用量が容量の 1/4 を下回った場合は削減できます (これにより、再割り当ての償却された一定のコストが得られます)。ただし、リストしたメソッドのみを使用する場合、STL 実装はいつでも vector を削減する義務はありません。

于 2012-05-21T14:52:15.187 に答える
0

C++ 標準は、存在している間はいつでもstd::vectorを減らす必要はありません。capacity()これは厳密に実装に依存するため、実装は独自のものである可能性がありますが、その動作に依存するべきではありません。

于 2012-05-21T14:54:16.787 に答える