タグ

TipsとSTLに関するiwwのブックマーク (2)

  • std::map - erase 時の iterator の無効化を防ぐ - yanaken@phper

    std::map を使用していると、 「ある条件を満たし(た|てない)要素を削除したい」 ってことがよくある。 そんな時はこんな感じにしてみる。 std::map<int, bool> hige; std::map<int, bool>::iterator it = hige.begin(); while (it != hige.end()) { if (it->second == true) { // ここがポイント hige.erase(it++); } else { ++it; } } [説明] std::map は要素を変更した場合に、以前まで保持していた iterator は無効になってしまう。 erase の戻り値も void なので何も期待できない。 だったら erase に渡す前の iterator を保持しちゃう。 std::map<int, bool>::iterato

    std::map - erase 時の iterator の無効化を防ぐ - yanaken@phper
  • その12 イテレート中のSTLのlistから要素を安全に削除する方法

    ホーム < ゲームつくろー! < Programming TIPs編 その12 イテレート中のSTLのlistから要素を安全に削除する方法 STLのコンテナは「イテレータ」によって要素を取り出します。この時良くあるのが「ある要素をチェックして、必要が無くなった場合はリストから削除する」という作業です。例えば描画オブジェクトのリストからもういらなくなったオブジェクトを除く時などこの作業が必要になります。 イテレート中のリストから要素を除く場合、ちょっと注意しないと思わぬバグが誘発します。この章ではイテレート中のリストから要素を除く方法をまとめます。まさにTIPsです(^-^;。 ① まともにやるとあっさりバグ 例として、int型のリストに0~9までの要素がこの順番で登録されているとしましょう。このリストをイテレートして「5」を取り除きたいとして、次のようなコードを書きました:

  • 1