スクリーンショット 2015-01-08 1.14.57

【cocos2d-x】ループ内でvectorの要素の削除

LINEで送る
Pocket

スクリーンショット 2015-01-08 1.14.57


簡単な様で意外と難しいvector要素の削除。

基本方針は以下です。



まず、やりたい事を順当にコード化するとこんな感じですが、
ある程度コーディングをしている人はこれが危ない事にはすぐに気付きます。
eraseをした時点で内部要素が全て前にずれて来ますので、実行時にクラッシュしますね。

そして、これを解決した事のある人は、以下の解決方法をまず思い浮かべるのではないでしょうか。

そうか、最後の要素から逆に走査、比較、削除を行えば良いんだと。

例えば、iOSではNSArrayのインスタンスに対して、reverseObjectEnumeratorなるメソッドを投げるとそんなのが返って来たな、cocosでも出来ないかな、なんて考えます。

これが、あるんですよね。

c++ Reference std::vector::rbegin
c++ Reference std::vector::rend

こいつがreverse_iteratorを返してくれてitr++するとvector要素を逆に走査してくれます。

そんなこんなで以下のコードを書きます。


これで、安全に要素が消せる…!


ところがしかし、eraseの引数はiterator型でないと駄目だとコンパイラに怒られる始末。。。


おい、一体どうすれば良いんだよと途方に暮れ、ようやく出来たのが以下のコード。(このブログトップの写真のコードです。)


ポイントは、numbers.erase(itr)の返り値をitrに代入する事。
erase(itr)は要素を削除し、その次の要素を返してくれるそうです。

誰かのお役に立てば。

このブログのcocos記事一覧

LINEで送る
Pocket

Dalt

translimit, Inc. Application Engineer. Twitter: @daiki1003 Facebok: Daiki Asahi

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です