2016-10-11 6 views
1

イベントとウィンドウの処理にSDLを使用していますが、forループで複数の要素を消去しているように見えません。私は2つの要素を持っており、削除キーを押すと "Testing"が2回印刷されます。しかし、両方の要素が "選択"されると(bool)、最初の要素だけが削除され、2番目の要素は削除されません。SDL投票イベント内の複数の要素を消去できません

この機能は、SDLの投票イベントループ内で呼び出されている:なぜこれが起こっている

static inline void tickEditorKeyFunctions(CBevent e) 
    { 
     if (e.type == SDL_KEYDOWN) 
     { 
      switch (e.key.keysym.sym) 
      { 
      case SDLK_w:     
       break; 
      case SDLK_s: 
       break; 
      case SDLK_a: 
       break; 
      case SDLK_d: 
       break; 
      case SDLK_LCTRL: 
       break; 
      case SDLK_LSHIFT: 
       break; 
      case SDLK_DELETE: 
       for (CBuint i = 0; i < _scene->static_meshes.size(); i++) 
       { 
       if (_scene->static_meshes[i]->_picked) 
        _scene->static_meshes.erase(_scene->static_meshes.begin() + i); 
       std::cout << "Testing" << std::endl; 
      } 

      _pick_list.clear(); 
       break; 
      default: 
       break; 
      } 
     } 
    } 

誰でも知っていますか?

ありがとうございました。

+3

はあなたがきれいで、再構築しようとしたことがあり試してみてください?あなたの 'for'ループはうまく見えます... – Jesse

+0

はい、あります。私はそれがSDLのイベントコールバックシステムと関係があると思います:/ – William

+1

@William SDLとは何の関係もなく、コレクションとイテレータの仕組みに関係しています。 –

答えて

0

static_meshesがSTLコレクションの場合、アイテムを削除するにはErase Remove Idiomを参照する必要があります。

_scene->static_meshes.erase(std::remove_if(_scene->static_meshes.begin(), 
              _scene->static_meshes.end(), 
              [](TYPEOF _scene->static_meshes *item){return item->picked;}), 
          _scene->static_meshes.end()); 
+0

ああ、私はこのイディオムを見ましたが、私のSTLコンテナでどのように動作するのか分かりませんでした。ソースコードを提供していただき、ありがとうございます。私はこれがforループの中にある必要はないと推測していますか? – William

+0

はオペレータのTYPEOF変数ですか? – William

+0

交換するタイプはありませんでした。ループにする必要はありません。 –

0

_scene->static_meshesがSTLコンテナ(ベクターなど)の場合、eraseはイテレータを破棄してサイズを変更します。配列が[0, 1, 2]で、インデックス1を消去した場合、この配列にはインデックス2がなくなり、現在は2つの要素しか含まれていません。 sizeが減少し、2回目の反復がまったく実行されないか、間違った要素で実行される可能性があります。考えられる解決策は、要素を消去した後にiをインクリメントしないことです。確かにそうする他の方法があります。

+0

はい、これは実際に問題になると思いました。それは確かに問題でなければなりません。 – William

関連する問題