0

これは、ベクターまたはマップからすべてのエントリを安全に削除する方法ですか?

ベクター

my_vector.erase(my_vector.begin(),my_vector.end());

たとえば、地図の場合

my_map.erase(my_map.begin(),my_map.end());

マップまたはベクター構造には、それらの要素のデストラクタで割り当て解除が処理される要素が含まれています

end() によって返される反復子の値は、要素を消去し始めると無効になりますか?

4

2 に答える 2

3

どちらのerase()方法も、2 番目の方法を除く反復子の範囲で機能するように設計されています。

// erase elements in range [a,b)
Iterator erase(Iterator a, Iterator b);

したがって、このように呼び出しても安全ですが、どちらの場合erase()でも呼び出したほうがよいでしょう。clear()

于 2013-09-30T09:33:57.470 に答える
1

erase(begin, end)forを呼び出すのは安全ですが、要素を反復処理するためのメンバ関数とイテレータを提供するstd::vector/std::map他の STL container( ) に対しても有効です。list, set, deque etcerase

有効な範囲 (beg,end) を渡す限り、以下の 2 つの範囲も有効であり、erase何の努力も必要ありません。

c.erase(c.begin(), c.begin());
c.erase(c.end(), clend());

std::vector::erase(beg,end)範囲 [beg,end) のすべての要素を削除し、次の要素の位置を返します。

std::map::erase(beg,end)範囲 [beg,end) のすべての要素を削除し、次の位置を返します (C++11 より前では何も返されませんでした)。


STL 内部実装ではerase(begin,end)、次のようないくつかの関数を呼び出します。

void clear() noexcept;
Effects: Behaves as if the function calls:
          erase(begin(), end());

void assign(size_type n, const T& t);
Effects:
   erase(begin(), end());
   insert(begin(), first, last);

ご覧のとおりerase(begin(),end());、 と同じclear()です。

swapまたは、で提案されている STL コンテナーをクリアするために呼び出すこともできますMore Effective STL

vector<Contestant> v;
vector<Contestant>().swap(v); //clear v and minimize its capacity
于 2013-09-30T09:56:59.613 に答える