0

ベクトルのベクトルがあり、メモリから myvec[i] を完全に削除したり、スペースを解放したりしたいと考えています。.erase または .clear は私のために仕事をしますか? そうでない場合は、どうすればよいですか?

4

2 に答える 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 に答える