タグ

2014年5月18日のブックマーク (3件)

  • 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
    uechoco
    uechoco 2014/05/18
    std::map、erase
  • STLでイテレータのループを組むときの注意 - HongoWiki

    C++で、STLのコンテナを使っていて、イテレータを用いて各要素にアクセスするループを書くときがあります。 要素を削除するメソッド、たとえばerase()やremove()をループの中で使う場合は、ループの終端判定がずれてしまわないように注意が必要で、具体的には毎回、イテレータとend()の比較をあらわに行う必要があります。 たとえば、SpaceWire/RMAP Libraryで、RMAPのTransaction IDのデータベースをmapで実装しているとします。 以下のようなループの記述は、危険です。ループの終端判定が正しく行われず、結果として不正なメモリアクセスを行う可能性があります(普通のOSなら不正メモリアクセスでプログラムが終了する)。 map<unsigned int,unsigned int> tidmap; map.insert(...tidを追加する操作...) map

    uechoco
    uechoco 2014/05/18
    iterator、std::map、erase
  • その12 イテレート中のSTLのlistから要素を安全に削除する方法

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

    uechoco
    uechoco 2014/05/18
    iterator、std::vector、std::deque、std::list、erase