Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 89
#1

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

27.07.2013, 20:29. Просмотров 2104. Ответов 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

Более чем уверен что, решение этой проблемы довольно простое, но увы я не могу его найти.
Спасибо за последующие ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 20:29     Удаление элемента из вектора ( std::vector<Bullet> )
Посмотрите здесь:

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

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

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

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

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

Обращение к полю элемента std::vector'a - C++
Здравстуйте! :) Несильно знаком с STL пока, возникла проблемка. Есть класс: class DataBase { public: char Surname; int...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1447 / 1176 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
27.07.2013, 20:38     Удаление элемента из вектора ( std::vector<Bullet> ) #2
Цитата Сообщение от 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));
NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 89
27.07.2013, 20:42  [ТС]     Удаление элемента из вектора ( std::vector<Bullet> ) #3
Спасибо, теперь всё работает.

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

Хм, второй вариант выглядит красиво, + это ты там лямбду используешь?
gray_fox
What a waste!
1447 / 1176 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
27.07.2013, 20:44     Удаление элемента из вектора ( std::vector<Bullet> ) #4
Цитата Сообщение от NanoBreaker Посмотреть сообщение
ты там лямбду используешь?
Да, можно отдельно лямбду\функцию\метод\функтор написать, если не один раз используется.
NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 89
27.07.2013, 20:47  [ТС]     Удаление элемента из вектора ( std::vector<Bullet> ) #5
Ещё раз спасибо, вопрос исчерпан. Не первый раз ты мне помогаешь )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 20:47     Удаление элемента из вектора ( std::vector<Bullet> )
Еще ссылки по теме:

Как изменять размер std::vector<std::vector>? - C++
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: std::vector&lt;std::vector&lt;float&gt;&gt; data; ...

Вывести значения std::vector<std::vector<int*> > - C++
Подскажите, как вывести значения? const size_t row = 3; const size_t col = 3; std::vector&lt;std::vector&lt;int*&gt; &gt; imatrix; //...

Как удалить первые три элемента в std::vector? - C++
Добрый вечер! у меня есть вектор vector&lt;MyClass&gt; v; где MyClass - какой-либо мой класс, допустим вектор заполнен на 6 ячеек. Как...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> - C++
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я ставлю закладку итератора, ...

Std::vector/QVector в классе или std::vector/QVector классов? - C++
Доброе время суток! Собственно вопрос в самой теме, есть некий класс class WorkJornal { private: string manager; ...

Теряю ссылку на элемент в std::vector после того, как делаю push_back следующего элемента - C++
Добрый день! Подскажите пожалуйста в чем причина моей ошибки. Сам работал на чистом C++, то есть использовал все по минимуму из C++. В...


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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1447 / 1176 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
27.07.2013, 20:47     Удаление элемента из вектора ( std::vector<Bullet> ) #6
Цитата Сообщение от 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));
Yandex
Объявления
27.07.2013, 20:47     Удаление элемента из вектора ( std::vector<Bullet> )
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru