どうも、uncleです
夏休みも残り2週間ほどですね
いかがお過ごしでしょうか?
ここ最近更新できてなくてすいません、
今回はちょっと面倒なvectorのeraseについて考えてみます
[1回]
ではまずvectorのおさらいです。
10行目で宣言を行い、
12~16行目で"White"や"Black"などの要素を追加しています
18~21行目で追加した要素を表示しています
23行目は処理を一時停止する処理です
大体どんなことが出来るのか理解できたでしょうか?
ではここから"Black"の要素を削除したいと思います。
赤枠の部分を追加しました
autoは
こちらで紹介しています
std::vector<std::string>::iteratorに変換されます
これできちんと”Black”が消え、表示もされます。
ではここから更にGreenを消そうとするとどうなるでしょうか?
更に赤枠の部分を追加してみました。
ですが実行すると
このようなエラーが発生します。
理由は簡単で、21行目で"Black"を削除した際にイテレータを再取得していないためです。
eraseの戻り値には新しいイテレータが渡されます。
これで先ほどのエラーは発生しません
または
このような方法でもいいでしょう。
ですが、これではまだまだ可読性の面で問題がありますよね
そこでstd::remove_ifと言うものを使用します
次は先頭がB、つまり"Black"と”Blue”を削除したいと思います
19行目ではstd::remove_ifを使用しています
ラムダ式は
こちらで紹介しています
これにはalgorithmのインクルードが必要です
中ではstd::moveが使用されているのですが要は3つ目の引数であるラムダ式でfalseを返したものをvectorの前から順に詰めています
なので最終的にゴミが残ります
そこでstd::remove_ifの戻り値にゴミが残っている部分の先頭が返ってくるのでそれをIteratorに受け取り、24行目でそこから後ろを消します
とまぁ長々とここまで書いてみたんですがどうせならstd::remove_ifとeraseを同時にやってくれよと思いますよね
なのでそんな素敵な関数の紹介です。
これが最後です。
今回はBoostを使用します。
詳細はGESブログ内でもどこでも検索してもらえれば導入方法が書いてあるかと思います。たぶん
分からなかったら聞いてください
まずBoostのパスを通し、「boost/range/algorithm_ext/erase.hpp」のインクルードを追加します
そして19行目でboost::remove_erase_ifを使用します。
実際に使用する場合にはnewした要素を追加すると思います
その際にはdeleteすることを忘れないようにしてください
では今回はこの辺で
以上!
PR
COMMENT