not good but great

プログラミング、アート、映画・本の感想について書きます。

イテレータを使ってvector配列の要素をeraseする

eraseを使う

ベクタ配列の要素を削除するにはeraseを使います。eraseの引数にはイテレータというものを渡します。僕の理解ではイテレータは配列の要素を指すポインタのようなものです。
・参考
Programming Place Plus

削除後はイテレータは無効になる

eraseするとイテレータは無効になります。これはeraseされて要素が前に詰められることで、イテレータが指す値がずれてしまうからです。正しい位置を指さないイテレータのことを無効と読んでいます。

イテレータを有効にする

eraseの返り値が有効なイテレータを返すようになっています。削除した要素数に合わせてイテレータを調整してくれるのだろうと思います。

code

vector<int>num;
vector<int>::iterator itr = num.begin();

//数字をセット
for (int i = 0; i < 10; i++) {
        num.push_back(i);
}

for (itr = num.begin(); itr != num.end();++itr) {
        //偶数だけ削除
        if ((*itr) % 2 == 0) {
                //有効なイテレータをセット
                itr = num.erase(itr);
        }
}

for (int i = 0; i < num.size(); i++) {
        cout << num[i] << endl;
}

実行結果

1
3
5
7
9

前置インクリメントと後置インクリメント違い

前置インクリメントは直接インスタンスの値を増加させて、値を返します。一方、後置インクリメントは一度インスタンスをコピーしてから増加させて、そのインスタンスを返します。後置インクリメントのほうがコピーする手間があるので、前置インクリメントが推奨されているみたいです。難しい!
・参考
C++で後置インクリメントよりも前置インクリメントが多用される理由 - 考える人、コードを書く人
http://homepage2.nifty.com/well/Operator.html#POST_INCREMENT