Аватар для NanoBreaker
23 / 23 / 10
Регистрация: 11.07.2013
Сообщений: 94

Удаление элемента из вектора ( std::vector<Bullet> )

27.07.2013, 20:29. Показов 4104. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
У меня возникла проблема во время удаления элементов, значения которых не удовлетворяли условию.

П.С: До того как создавать тему, я пошастал по форуму, но так и не нашел похожей проблемы и её решения, поэтому и создал это тему.

Есть следующие файлы:
Main.cpp
Bullet.hpp
Bullet.cpp

(В глубину кода можете не вдоваться, рисую пули в OpenGL, в координатной оси с осями от -250 до 250, и приходиться производить дополнительные вычисления для перевода координат пуль из одной системы координат в другую)

Main.cpp(выделил нужный кусок кода):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "Bullet.hpp"
 
vector<Bullet> bullets;
 
. . . .
 
for(auto iter = bullets.begin(); iter != bullets.end(); iter++)
{
    if( iter -> x > 250 || iter -> x < -250 || iter -> y > 250 || iter -> y < -250 ){
        bullets.erase(iter);
    }else{
        iter -> moveBullet();
    }
}

Bullet.hpp:

C++
1
2
3
4
5
6
7
8
9
10
11
struct Bullet{
 
    double x;
    double y;
    double k;
 
    bool isXnegative;
 
    void initBullet(double _x, double _y);
    void moveBullet();
};
Bullet.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "Bullet.hpp"
 
void Bullet::initBullet(double _x, double _y)
{
    _x = _x - 250;
    _y = 250 -_y;
    k = _y / _x;
 
    if(_x < 0) isXnegative = true; else isXnegative = false;
 
    x = 0;
    y = 0;
}
 
void Bullet::moveBullet()
{
    if(isXnegative){
        x -= 0.5;
    }else{
        x += 0.5;
    }
    y = k * x;
}
Когда пуля выходит за допустимое значение, то есть не удовлетворяет условию из main.cpp, она должна удалиться.
Но я получаю следующую ошибку: "Expression: vector iterator not incrementable"

В интернете не мало времени потратил на поиск решения этой проблемы, уже понял что так удалять нельзя, и за собой ещё надо удалять этот итератор, но когда я делаю
C++
1
vector<Bullet*>::iterator iter = bullets.begin();
чтоб в дальнейшем удалить и итератор, он мне говорит, что:

IntelliSense: no suitable user-defined conversion from "std::_Vector_iterator<std::_Vector_val< std::_Simple_types<Bullet>>>" to "std::_Vector_iterator<std::_Vector_val< std::_Simple_types<Bullet *>>>" exists c:\Users\NanoBreaker\Documents\Visual Studio 2012\Projects\Bullet's trajectory\Bullet's trajectory\Main.cpp 53

Более чем уверен что, решение этой проблемы довольно простое, но увы я не могу его найти.
Спасибо за последующие ответы.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.07.2013, 20:29
Ответы с готовыми решениями:

Удаление элемента из std::vector<>
- Здравствуйте завсегдатаи! Подскажите пожалуйста, можно ли из STL-ского вектора std::vector&lt;int&gt; удалить не последний элемент...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Копирование вектора (std::vector)
Есть некоторая структура Measure_Simulation, которая включает в себя достаточно много полей типа int, long, long double, char*, bool. И...

5
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
27.07.2013, 20:38
Цитата Сообщение от NanoBreaker Посмотреть сообщение
for(auto iter = bullets.begin(); iter != bullets.end(); iter++) { if( iter -> x > 250 || iter -> x < -250 || iter -> y > 250 || iter -> y < -250 ){ bullets.erase(iter); }else{ iter -> moveBullet(); } }
C++
1
2
3
4
5
6
7
8
for (auto iter = bullets.begin(); iter != bullets.end(); ) {
   if (/* ... */) {
      iter = bullets.erase(iter);
   } else {
      iter->moveBullet();
      ++iter;
   }
}
Добавлено через 56 секунд
Просто после erase(iter) iter становиться невалидным.

Добавлено через 3 минуты
вообще как то так
C++
1
2
3
4
5
6
bullets.erase(
      std::remove_if(std::begin(bullets), std::end(bullets), [] (Bullet const& bullet) {
            return (bullet.x > 250 || bullet.x < -250 || bullet.y > 250 || bullet.y < -250);
      })
    , std::end(bullets));
std::for_each(std::begin(bullets), std::end(bullets), std::mem_fn(&Bullet::moveBullet));
1
 Аватар для NanoBreaker
23 / 23 / 10
Регистрация: 11.07.2013
Сообщений: 94
27.07.2013, 20:42  [ТС]
Спасибо, теперь всё работает.

Добавлено через 1 минуту

Хм, второй вариант выглядит красиво, + это ты там лямбду используешь?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
27.07.2013, 20:44
Цитата Сообщение от NanoBreaker Посмотреть сообщение
ты там лямбду используешь?
Да, можно отдельно лямбду\функцию\метод\функтор написать, если не один раз используется.
0
 Аватар для NanoBreaker
23 / 23 / 10
Регистрация: 11.07.2013
Сообщений: 94
27.07.2013, 20:47  [ТС]
Ещё раз спасибо, вопрос исчерпан. Не первый раз ты мне помогаешь )
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
27.07.2013, 20:47
Цитата Сообщение от NanoBreaker Посмотреть сообщение
Хм, второй вариант выглядит красиво
Ну я бы предпочёл что-нибудь менее громоздкое, хотя бы так:
C++
1
2
bullets.erase(boost::remove_if(bullets, [] (Bullet const& bullet) { return /* ... */}), std::end(bullets));
boost::for_each(bullets, std::mem_fn(&Bullets::moveBullet));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.07.2013, 20:47
Помогаю со студенческими работами здесь

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

Как реализовать матрицу посредством двумерного вектора? (std::vector)
const int matrix_A_Columns = 12000; const int matrix_A_Rows = 25000; double matrix_A; как вот это написать с помощью вектора?

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

Удаление элементов из std::vector
У меня есть класс Zone. Но объявлен как массив vector в другом классе. class World { public: std::vector&lt;Zone*&gt;Zones; ...

Абстрактный класс, удаление наследника из std::vector<T>
При удалении через итератор выбивает ошибку в ходе выполнения программы. Имеется абстрактный класс: class Fruit : public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Деплой Flask приложения
py-thonny 23.06.2025
За годы работы с Flask я натыкался на одни и те же грабли достаточно часто, чтобы наконец научится их обходить. И сегодня хочу поделится опытом, который сбережет вам немало нервных клеток. Начнем с. . .
WebAssembly и контейнеры в .NET Aspire для оркестрации распределенных архитектур
ArchitectMsa 23.06.2025
Я наблюдаю, как WebAssembly (или просто WASM) постепенно выходит за рамки своего первоначального предназначения — исполнения кода на стороне браузера. Теперь эта технология проникает в серверную. . .
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru