削除
- erase()は1つ以上の要素を削除して、消えたところに後ろの要素を詰める。
- clear()はすべての要素を削除
- remove(),remove_if()は条件に合う要素を削除して、消えたところに後ろの要素をコピー。
サンプル
vector::clear()
vec.clear();
- before
- |W|H|O| |I|N|S|I|D|E|?|!| (size==12)
- after
- || (size==0)
vector::erase()
vector<char>::iterator it = vec.begin(); for (; it != vec.end(); ++it) { if (*it == 'I') { vec.erase(it); } }
- before
- |W|H|O| |I|N|S|I|D|E|?|!| (size==12)
- after
- |W|H|O| |N|S|D|E|?|!| (size==10)
algorithm::remove()
remove(v.begin(), v.end(), 'I');
- before
- |W|H|O| |I|N|S|I|D|E|?|!| (size==12)
- after
- |W|H|O| |N|S|D|E|?|!|?|!| (size==12)
超!注意点
以下のような注意点がある。
vector::erase()
以下のコードは、非常に危険。
vector<char>::iterator it = vec.begin(); const vector<char>::iterator end = vec.end(); for (; it != end; ++it) { if (*it == 'I') { vec.erase(it); } }
erase()後には、最後の要素がvecから取り除かれてはいるものの、
endがerase()後にも変わらないため、forループ中に最後の要素を指してしまう。
algorithm::remove()
remove()後もvectorのサイズは変化しない(最後尾にゴミが残る)ため、
vector::end()で最後尾のイテレータを取得することができない。
そのため、remove()の戻り値を利用する。
例
- before
- |W|H|O| |I|N|S|I|D|E|?|!| (size==12)
- after
- |W|H|O| |N|S|D|E|?|!|?|!| (size==12)
vector::begin() | 「WHO」の「W」 |
vector::end() | 「?!?!」の「後ろ」 |
remove() | 「!?!」の「?」 |