次の違いは何ですか:
std::vector::erase
と
std::vector::clear
私がやりたいことは、メモリアドレスを含むすべての要素、位置を取り除き、例外がスローされないようにすることです。
vector<array<double,1000>> S1(1000);
最後に、作成された 1000*2 のメモリ アドレスを削除したいと思います。
erase
位置によって選択的に要素を取り除きます。clear
無条件にすべての要素を取り除き、呼び出しの構文糖衣と見なすことができますv.erase(v.begin(),v.end());
私が考えることができるメモリを解放する唯一の確実な方法は、一時的なベクトルと交換することです:
vector<array<double,1000>> S1(1000);
...
vector<array<double,1000>>().swap(S1);
これは最初は奇妙に見えるかもしれませんが、よく知られており、広く使用されているイディオムです。
C++ 11 では、元のベクトルからの移動がオプションになる可能性がありますが、メモリをクリアしたり、ベクトルをクリアしたりすることは保証されていません (ただし、実装がそうしない理由は考えられません)。
{
vector<array<double,1000>> tmp(std::move(S1));
} // tmp dies on exiting scope, memory is cleared
あるいは、 を呼び出すとstd::vector::shrink_to_fit
メモリの割り当てが解除される可能性がありますが、保証はありません。
S1.clear();
S1.shrink_to_fit();
Erase では開始位置と終了位置を指定できますが、clear ではベクター全体をクリアします。
この関数clear()
はベクトルを空にします。この関数erase()
は、選択的な要素を削除します (いくつかのオーバーロードがあります)。erase(v.begin(), v.end());
を呼び出すのと同じclear();
です。作成されたメモリは、将来の使用に備えて予約されます。このすべてのメモリを確実に解放したい場合は、C++11 コンパイラを使用している場合は、を呼び出しv.clear();
てからを呼び出します。v.shrink_to_fit()
(メモリが解放されるという実際の保証はありません。これは単なる要求ですが、メモリを解放しないコンパイラは知りません。) C++11 に準拠していない場合は、別の方法を使用してください。std::vector<std::array<double,1000>>().swap(v);
. それはイディオムに合うように縮小と呼ばれます。