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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2010, 09:46   #1
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию итераторы и vector.erase(

Здравствуйте, есть вот такой вот фрагмент кода:
Код:
// serv->clients определен как vector< CVoIPServClient *>
for( vector< CVoIPServClient *>::iterator  l = serv->clients.begin(); l != serv->clients.end(); l++)
		    {
			
				if (!(*l)->GetState()) // отдает информацию об активности клиента
				dataset.push_back( (*l)->GetData()); //некая полезная работа
				else //если состояние нам не нравится - удаляем клиент
				{
					printf("Client count: %d \n", serv->clients.size());
					printf("delete client...ID  %d \n ",(*l)->GetID());
					delete (*l);
					serv->clients.erase(l); // удаляем из списка указатель
					printf("Client count: %d", serv->clients.size());
				}
			}
где serv->clients - коллекция подключенных клиентов, имеющих поле состояния и доступ к нему через GetState как только состояние изменяется клиента необходимо удалить ( delete (*l); ). Так же необходимо исключить "мертвую душу" из serv->clients. И вот тут начинаются проблемы: для удаления элемента вектора вызываем erase(текущий итератор), удаляется... но попытка инкремента итератора вызывает ошибку , то есть итератор не желает переходить на следующйи элемент, пробовал после erase присваиваить итератору begin(), не помогло, все равно дохнет ... с STL только знакомлюсь, поэтому кажется собираю все возможные грабли...
Teksa вне форума Ответить с цитированием
Старый 28.04.2010, 09:49   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Нужны новые итераторы, ибо при удалении элемента вектор может перестроится.
PS на сколько помню, erase( iterator ) возвращает итератор на следующий элемент
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 28.04.2010, 10:06   #3
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию

Спасибо, пробовал: l=serv->clients.erase(l); - толку ноль.
break цикла после удаления - спасает, но нежелателен...
Teksa вне форума Ответить с цитированием
Старый 28.04.2010, 10:13   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Код:
delete (*l);
serv->clients.erase(l); // удаляем из списка указатель
если после этого сделать:
l = serv->clients.begin();
тоже не работает ? Странно всё это =) На вашем месте я бы еще убрал строчку delete (*l); на время, а то мало ли )
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux

Последний раз редактировалось ozo; 28.04.2010 в 10:19.
ozo вне форума Ответить с цитированием
Старый 28.04.2010, 10:37   #5
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию

пробовал убирать , не влияет В итоге модифицировал схемку с break цикла в конце, а то в мелочах завязну. l = serv->clients.begin() - попробовал до того как на форуме отписался, все равно на l++ слетает спасибо за помощь.
Teksa вне форума Ответить с цитированием
Старый 28.04.2010, 15:05   #6
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Код:
std::vector<Quastion>::iterator i = quastions->begin();
while(i != quastions->end() ){
  ...;
  if( некое условие ){
    quastions->erase(i);
    ...;
    i = quastions->begin();
  } else 
	++i;
}
Я где-то так делал, вроде бы работает исправно
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
vector NiCola999 Помощь студентам 5 26.02.2010 08:37
std::vector ciaonataha Общие вопросы C/C++ 1 10.05.2009 15:50
Вопрос по <vector> kezman Общие вопросы C/C++ 1 13.08.2008 21:48