STL - vector

Last-modified: 2006-09-13 (水) 11:06:04

削除

  • 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()「!?!」の「?」