std::vector - erase 時に std::remove を活用する

std::vector で特定を消去したい時に便利な方法があったので記載。
とりあえず今までのコードを記述。

std::vector<int> hige;
hige.push_back(2);
hige.push_back(5);
hige.push_back(2);
hige.push_back(6);
...
std::vector<int>::iterator it = hige.begin();
while (it != hige.end()) {
    if (*it == 2) {
        it = hige.erase(it);
    }
    else {
        ++it;
    }
}

std::remove を使用するとこうなる。

std::vector<int> hige;
hige.push_back(2);
hige.push_back(5);
hige.push_back(2);
hige.push_back(6);
...
hige.erase(std::remove(hige.begin(), hige.end(), 2), hige.end());

[説明]
std::vector - erase は [begin, end) 範囲の要素を削除する。
std::remove は [begin, end) 範囲の指定された値(=2)が切り詰められる
切り詰められるだけなので、コンテナサイズは変わらない。

hige = {5,6,2,6}  // 切り詰められた結果、末尾の{2,6}が残る

切り詰められた末尾の iterator が戻り値となる。

hige = {5,6,^2,6} // ^ の iterator ポインタが戻り値となる

2行に分けるとこんな感じになる。

// hige = {2,5,2,6}
std::vector<int>::iterator it = std::remove(hige.begin(), hige.end(), 2); // hige = {5,6,2,6}
hige.erase(it, hige.end()); // hige = {5,6}


参考リンク
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E6%B6%88%E5%8E%BB%E3%83%BB%E5%89%8A%E9%99%A4%28Erase-Remove%29