ベクトルのベクトルがあり、メモリから myvec[i] を完全に削除したり、スペースを解放したりしたいと考えています。.erase または .clear は私のために仕事をしますか? そうでない場合は、どうすればよいですか?
質問する
809 次
2 に答える
1
myvec.erase( myvec.begin() + i )
完全に削除myvec[i]
し、デストラクタを呼び出し、動的に割り当てられたメモリをすべて解放します。によって直接使用されるメモリは減りませんmyvec
。1myvec.size()
減りますが、変更されmyvec.capacity()
ません。この最後の残基を削除するために、C++11 には がありmyvec.shrink_to_fit()
、削除される可能性があります。それ以外の場合は、 の完全なコピーを作成してから、次のmyvec
ように入れ替える必要があります。
void
shrink_to_fit( MyVecType& target )
{
MyVecType tmp( target.begin(), target.end() );
target.swap( tmp );
}
(これは基本的に内部shring_to_fit
で行われることです。) これは非常にコストのかかる操作であり、少なくとも単一の要素の削除に関しては、実際の利益はほとんどありません。多数の要素を消去する場合は、すべての消去後に検討する価値があるかもしれません。
最後に、すべての要素を消去する場合は、
上記と同じ考慮事項で、各要素myvec.clear()
の場合とまったく同じです。myvec.erase()
この場合、空のベクターを作成してスワップする方が良い解決策です。
于 2013-06-16T09:32:57.843 に答える