2015-01-26 2 views
1

Довольно простой вопрос.Удалить элемент из vector, используя ключевое слово 'this'

У меня есть объект Bullet, где в какой-то момент, когда пуля сталкивается с объектом, она уничтожается и удаляется из вектора Bullets.

Каждый объект Bullet имеет ссылку на вектор/список пуль.

Как удалить его с помощью этого ключевого слова в классе Bullet, когда это произойдет?

void collide(){ 
    //error C2678: binary '==': no operator found which takes a left-hand operand of type 'Bullet' 
    //(or there is no acceptable conversion) 
    bullets->erase(std::remove(bullets->begin(), bullets->end(), *this), bullets->end()); 
} 

Так что да, этот код дает мне странную ошибку. Мне нужно знать, как это сделать, не итерации над вектором пуль с использованием цикла while/for и просто использования векторных функций. Очевидно, что текущий метод не работает, поскольку он извергает ошибку, как прокомментировал код.

Я также попытался использовать find() вместо remove(), такую ​​же ошибку.

+6

Есть ли у вас оператор равенства (оператор, т.е. '' ==) для класса 'Bullet'? –

+6

Сообщение об ошибке может быть более четким. И 'std :: remove' * делает * итерацию по вектору, поэтому будьте осторожны, что этот подход имеет линейную стоимость независимо. –

+0

У меня его нет, но я действительно мог бы использовать решение. Я видел другие примеры здесь, которые не нуждались в реализации оператора ==, но они все еще работали с этим методом. Честно говоря, просто как удалить элемент (это) из вектора? –

ответ

2

вам необходимо реализовать оператор == в классе пули. , если вы хотите, чтобы удалить элемент в соответствии с его адрес памяти, вы можете просто перебирать вектор и найти элемент наивности:

for (Bullet& bullet : bullets){ 
     if (&bullet == this){ 
      bullets.erase(bullet); 
      break; 
     } 
    } 
+3

Это не безопасно. Вектор перераспределяет его содержимое при стирании, поэтому итератор недействителен. Объяснено здесь http://stackoverflow.com/questions/10360461/removing-item-from-vector-while-in-c11-range-for-loop – SGrebenkin

+0

исправлено. Спасибо, парни –

1

Вы должны получить итератор на объект, который вы хотите удалить. Вы можете получить его, используя разницу между первым и текущим объектом:

bullets->erase(bullets->begin() + (this - &bullets.front())); 

Обратите внимание, что это уничтожит объект, метод, который вы в настоящее время выполнения, то есть, вы не можете получить доступ к любым задачам пользователя после ,

2

Попробуйте это:

std::remove_if(bullets.begin(), bullets.end(), 
    [this] (const Bullet& s) { 
     if (&s == this) 
      return true; 
     return false; 
    } 
);