『私の最初のc++本』学習ノート:STLの反復器ポインタの使用注意事項

577 ワード

次のようになります.
コンテナ内の要素を削除するループ
for (auto it=vecSalary.begin(); it != vecSalary.end(); ++it)
	{
		if(*it < 2)
		{
			vecSalary.erase(it);
		}
	}

正しいように見えますが、よく分析すると、
ある要素を削除すると、その要素の下位が自動的に1つ前に移動してvectorの連続性を維持します.この場合、反復器は削除された要素の下位要素を指しますが、この場合++itのため、反復器はまた1つ後ろに移動します.
要素を削除しない前に反復器が2ビット後ろに移動すると、一部の要素がチェックされずに削除されない可能性があります.
正しい書き方は次のとおりです.
for (auto it=vecSalary.begin(); it != vecSalary.end(); )
	{
		if(*it < 2)
		{
			it = vecSalary.erase(it);
		}
		else
		{
			++it;
		}
	}