大福餅

大福餅

C++ の vector から要素を完全に取り除く方法

leetcode.com

 

この頃コードを書く習慣が無くなってきているので、思い出しついでにLeetCodeの簡単な問題から解いて、感覚を取り戻している。

 

今日は、冒頭のリンク先の問題である「すでに数値が入っている配列から、指定した数値を取り除いた配列にする」問題を解いた時に調べた知見を共有する。

 

概要

  • vectorのある要素を完全に削除する方法は、以下のページの通り

zenn.dev

 

vec.erase(remove(vec.begin(), vec.end()), vec.end())

 

  • eraseは、指定した要素を取り除く
  • removeは、範囲から指定した数値を取り除き、配列の末尾のイテレータを返す
  • しかし、removeだと要素数は変わらず取り除かれて空いた分は、配列の最後の数値が末尾に追加されるらしい
    • [1, 2, 2, 3, 4] とあって 2を削除する場合、[1, 3, ,4, 4, 4] と詰めた後に、末尾に配列の最後の要素を追加する
  • removeで指定した数値を取り除き、erasa で追加された要素の最初から配列の最後までを削除することで、完全に排除できる
    • [1, 2, 2, 3, 4] から 2 を削除するとすると、removeで[1, 3, 4, 4, 4] とし、この場合4番目の要素から最後の要素をerasaで指定し削除する

所感

  • 最初removeだけだと、配列に謎の数値が入っていたので正解扱いにならなかったので調べた。
  • removeの仕様にそんなのがあったのなんて知らなかった。
  • 指定した要素を取り除くだけでなく、要素数も減らしたいということは結構あると思うので、これは覚えておきたいと思った。