Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2014, 22:54   #1
Marmazyaka
Новичок
Джуниор
 
Регистрация: 10.09.2013
Сообщений: 2
По умолчанию Не могу разобраться с функцией erase для vectora

Код:
for (std::vector<Passenger>::iterator it = this->request.begin(); it != this->request.end(); ++it)	
		{			
			if (it->GetStart() == this->current_floor) 
			{
				if (it->Direction() == this->Direction())
				{
					this->AddPassanger(*it); //вставляю в другой vector это точно работает
					this->request.erase(it);
					t = true;
					++count;
				}
			}
		}
программа падает после удаления одного из элементов при переходе на следующий цикл. пишет, что итератор не может быть инкрементирован. мотет я, что то не так делаю.
Marmazyaka вне форума Ответить с цитированием
Старый 18.04.2014, 16:55   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

В строке:

Код:
this->request.erase(it);
Вы прибиваете данные по итератору, и он у вас делается невалидным.
После чего на очередном витке цикла, уже невалидному итератору делается:
Код:
++it
Срабатывает ассерт-защита, которая предупреждает вас: попытка инкрементировать невалидный итератор.

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

Если вы удаляете налету, вы должны подменить значение it значением следующего валидного итератора, что бы цикл мог продолжаться дальше.

Пример:


http://rextester.com/WJMW34419

Код:
#include <iostream>     // std::cout
#include <iterator>     // std::ostream_iterator
#include <algorithm>    // std::generate, std::remove
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand


int main()
{
    std::cout << "Hello, world!\n";

    //--- создаем и заполняем контейнер случайными данными    
    std::vector<int> data(5);
    std::generate(data.begin(), data.end(), [](){ return (std::rand()%100);}  );
    
    
   
    //--- выводим в консоль содержимое контейнера
    std::cout<<" --- before: ";
    std::copy( data.begin(), data.end(), std::ostream_iterator<int>(std::cout, ", ") );
    std::cout<<'\n';
    
    //--- теперь бежим по всем элементам контейнера, и если обнаружим ноль - удаляем его на лету
    auto it = data.begin();
    while (it != data.end() )	
        (*it == 0)? it = data.erase(it) : ++it;

    //--- выводим в консоль оставшиеся элементы
    std::cout<<" --- after:  ";
    std::copy( data.begin(), data.end(), std::ostream_iterator<int>(std::cout, ", ") );
    std::cout<<'\n';

    
    //--- теперь бежим по всем элементам контейнера, и если обнаружим 34 - удаляем его
    data.erase( std::remove( data.begin(), data.end(), 34 ) );
    
    //--- выводим в консоль оставшиеся элементы
    std::cout<<" --- total:  ";
    std::copy( data.begin(), data.end(), std::ostream_iterator<int>(std::cout, ", ") );
    std::cout<<'\n';
}
_Bers вне форума Ответить с цитированием
Старый 21.04.2014, 20:31   #3
Marmazyaka
Новичок
Джуниор
 
Регистрация: 10.09.2013
Сообщений: 2
По умолчанию

_Bers, спасибо.
Marmazyaka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу разобраться с функцией avov Общие вопросы C/C++ 7 06.02.2012 00:54
Не могу разобраться с функцией ReadConsole Иллидан Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 10.10.2010 17:34
Не могу разобраться с условием для создания таблицы Nimfeto4kA Microsoft Office Excel 0 13.05.2010 21:01
Подскажите, не могу разобраться с функцией INSERT KARUSHEV БД в Delphi 27 17.07.2009 17:54