2

次の違いは何ですか:

std::vector::erase

std::vector::clear

私がやりたいことは、メモリアドレスを含むすべての要素、位置を取り除き、例外がスローされないようにすることです。

vector<array<double,1000>> S1(1000);

最後に、作成された 1000*2 のメモリ アドレスを削除したいと思います。

4

5 に答える 5

4

erase位置によって選択的に要素を取り除きます。clear無条件にすべての要素を取り除き、呼び出しの構文糖衣と見なすことができますv.erase(v.begin(),v.end());

于 2013-06-24T08:30:31.473 に答える
2

私が考えることができるメモリを解放する唯一の確実な方法は、一時的なベクトルと交換することです:

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();
于 2013-06-24T08:43:26.313 に答える
0

Erase では開始位置と終了位置を指定できますが、clear ではベクター全体をクリアします。

http://www.cplusplus.com/reference/vector/vector/erase/

http://www.cplusplus.com/reference/vector/vector/clear/

于 2013-06-24T08:31:39.033 に答える
0

この関数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);. それはイディオムに合うように縮小と呼ばれます。

于 2013-06-24T08:56:17.773 に答える