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}