Я получаю сообщение об ошибке, когда пытаюсь стирать элемент из вектора, если элемент не установлен логическим. Я попытался найти сеть, но ничего не нашел. Я попытался найти различные способы удаления элементов по индексу x в векторе и нашел функцию: vector.erase(vector.begin() + index)
Поэтому, когда я пытаюсь использовать его в моем цикле for, я получаю доступ к точке доступа, указывающий на строку функции стирания.
Код для цикла, в котором ошибка:
if (!player.getBullets().empty())
{
for (int x = 0; x < player.getBullets().size(); x++)
{
//Check for projectiles whos status is dead.
if (!player.getBullets()[x]->getAlive())
{
//Erase the element at position x.
player.getBullets().erase(player.getBullets().begin() + x);
}
}
}
Это намного проще стереть правильно, если вы используете итератор вместо индекса. Прямое преобразование кода (почти):
vector<Projectile*> bullets = player.getBullets();
for (vector<Projectile*>::iterator x = bullets.begin(); x != bullets.end(); )
{
//Check for projectiles whos status is dead.
if (!(*x)->getAlive())
{
//Erase the element at position x.
x = bullets.erase(x);
}
else
{
++ x;
}
}
Обратите внимание, что это работает только с локальной копией вектора. Если вы хотите обновить вектор в самом классе игрока, вам нужно будет изменить getBullets
чтобы вернуть ссылку:
vector<Projectile*> &Sprite::getBullets()
{
return bullets;
}
А затем для цикла:
vector<Projectile*> &bullets = player.getBullets();
auto
потому что я не знаю тип вашего вектора, но если вы скажете мне тип вашего вектора, я могу обновить ответ, чтобы избежать auto
.
Не изобретайте велосипед, особенно не очень сложный, который может попасть под воду и стены. Используйте готовый вариант:
#include <algorithm>
player.getBullets().erase(
std::remove_if(player.getBullets().begin(),
player.getBullets().end(),
[](Projectile * p) -> bool { return !p->getAlive(); }),
player.getBullets().end());
(Я предполагаю, что Bullet
такой же, как decltype(player.getBullets())::value_type
, т. decltype(player.getBullets())::value_type
Тип элемента контейнера decltype(player.getBullets())::value_type
.
Хотя цикл недействителен, потому что счетчик x увеличивается, а размер вектора уменьшается, и в результате не весь вектор пересекается, я не вижу причины нарушения доступа. Я думаю, что проблема связана с объектами, хранящимися в векторе.
g++ -Wall -g
), и вы должны использовать отладчик (например,gdb
) и показать заданную им обратную трассировку.