忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

vectorのeraseを考える


どうも、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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]