stlコンテナがループループで要素を削除する方法

1266 ワード

実際のアプリケーションでは、コンテナ内の要素を巡回し、特定の条件を判断した後、コンテナから要素を消去するシーンに遭遇します.
#include 

#include 
#include 
#include 
#include 
#include 

template
void del(T t, int pos)
{
	//  
	int i = 0;
	for (typename T::iterator it = t.begin(); it != t.end(); ++i)
	{
		printf("%d ", *it);
		if (i == pos)
		{
			t.erase(it++);
		}
		else
			++it;
	}
	printf("
"); } int main() { std::map mp; std::set st; std::list lt; std::vector vec; std::deque dque; for (int i = 0; i < 10; ++i) { mp.insert(std::make_pair(i, i)); st.insert(i); lt.push_back(i); vec.push_back(i); dque.push_back(i); } del(mp, 5); del(st, 5); del(lt, 5); del(vec, 5); del(dque, 5); return 0; }

上のコードに注意して、it++または++itは、forループヘッダではなく、forループ体内で発生します.削除する場合は、
t.erase(it++);

it++というリロード操作はitを後方に移動させ、現在の反復位置を返します.
上記のコードを実行するとmap,set,listが正しく値を出力し,vecまたはdqueを実行するとeraseを実行した後にitが無効になり,次のループで値の取得に失敗するため断言クラッシュが発生する.
したがって、以上のようなループループで要素を削除し、ループを継続する方法に影響を及ぼさずにリレーショナルコンテナ(map,list,setなど)に使用することができ、線形コンテナ(vector,dequeなど)に問題が発生することに注意してください.