2016-10-11 1 views
1

Я использую SDL для обработки событий и окон, однако я не могу стереть несколько элементов в цикле for. У меня есть два элемента, и он дважды выдает «Тестирование» при ударе ключа - отлично! Однако, когда оба элемента «выбраны» (bool), он удаляет только первый элемент, а не второй.Невозможно стереть несколько элементов внутри событий опроса 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 будет уменьшен, и ваша вторая итерация может вообще не выполняться или быть выполнена на неправильном элементе. Возможное решение не увеличивает i после стирания элемента. Конечно, есть и другие способы сделать это.

+0

Да, я думал, что это будет проблема на самом деле. Это, безусловно, проблема. – William

Смежные вопросы