反復器の使用--反復器の失効について


これはプログラマーの面接宝典の小さな問題です.
ポイントは、eraseを使用すると反復器が無効になります.
実際に無効になったのは、元の反復器で、1つの要素を削除した後、自動的に次の要素を指します.
テストコードは、コンテナの値が6のすべての要素を削除します.
Aエラーのコードは次のとおりです.
#include <iostream>
#include <vector>

using namespace std;

void print(vector<int>);

int main()
{
        vector<int> array;
        array.push_back(1);
        array.push_back(6);
        array.push_back(6);
        array.push_back(3);
        vector<int> :: iterator itor;

        for (itor = array.begin(); itor != array.end(); itor++)
        {
                if (6 == *itor)
                {
                        array.erase(itor);
                }
        }

        cout << "vector size is: " << array.size() << endl;
        for (itor = array.begin(); itor != array.end(); itor++)
        {
                cout << *itor << " " << endl;
        }

        return 0;
}

出力の結果は:1,6,3.2番目の6は削除されていません.
B修正後のコードは以下の通りである.
#include <iostream>
#include <vector>

using namespace std;

void print(vector<int>);

int main()
{
        vector<int> array;
        array.push_back(1);
        array.push_back(6);
        array.push_back(6);
        array.push_back(3);
        vector<int> :: iterator itor;

        for (itor = array.begin(); itor != array.end();)
        {
                if (6 == *itor)
                {
                        array.erase(itor);
                }
                else
                        itor++;
        }

        cout << "vector size is: " << array.size() << endl;
        for (itor = array.begin(); itor != array.end(); itor++)
        {
                cout << *itor << " " << endl;
        }

        return 0;
}


結果は1,3
これにより、eraseを使用すると、反復器は次の要素を自動的に指します.