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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2011, 00:55   #1
Anarios
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 11
По умолчанию Проблема с map

Если кратко - решаю задачу с UvaOnlineJudge, пользуюсь массивом листов и мэпом. Есть несколько аналогичных методов в которых у меня всё работает, в одном методе возникает непонятная мне проблема.

Код:
void pileOver(int a, int b, std::vector<std::list<int> > &v, std::map<int, int> &myMap)
{
	bool check = false;
	for(std::list<int>::iterator it = v[myMap[a]].begin(); it != v[myMap[a]].end(); it++)
	{
		
		if(*it == a)
		{
			check = true;
		}
		if(check)
		{
			v[myMap[b]].push_back(*it);
			//myMap[*it] = myMap[b];
		}
	}

}
закоментированная строка крашит программу с текстом Expression: list iterators incompatible. без неё всё работает. при этом если заменить
Код:
myMap[*it] = myMap[b];
на бессмысленное
Код:
myMap[*it] = myMap[*it];
то краша не будет
При этом судя по дебагеру краш происходит в строке объявления цикла

Последний раз редактировалось Anarios; 20.12.2011 в 01:00.
Anarios вне форума Ответить с цитированием
Старый 20.12.2011, 02:55   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

есть подозрение, что результатом "myMap[b] " является нечто неприемлемое в выражении v[myMap[b]].push_back(*it);
_Bers вне форума Ответить с цитированием
Старый 20.12.2011, 03:00   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

хотя... неееет....

myMap[*it] = myMap[b]; //проверь, существует ли myMap[b]

И вообще, если ключ не существует, создаётся новый элемент. Но при этом что нить возвращается?
_Bers вне форума Ответить с цитированием
Старый 20.12.2011, 04:12   #4
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Все правильно дебагер показывает. Падает здесь: it != v[myMap[a]].end().
Потому что после myMap[*it] = myMap[b], на след итерации цикла myMap[a] меняется на myMap[b]. Значит v[myMap[a]] будет уже другим контейнером. А сравнивать итераторы разных контейнеров - epic fail.
still_alive вне форума Ответить с цитированием
Старый 20.12.2011, 04:20   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Все правильно дебагер показывает. Падает здесь: it != v[myMap[a]].end().
Потому что после myMap[*it] = myMap[b], на след итерации цикла myMap[a] меняется на myMap[b]. Значит v[myMap[a]] будет уже другим контейнером. А сравнивать итераторы разных контейнеров - epic fail.
здесь же it никак не модифицируется...
_Bers вне форума Ответить с цитированием
Старый 20.12.2011, 04:26   #6
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Причем тут it? Меняется мэп. А именно раньше там по ключу "а" лежало одно значение, а потом мы туда положили myMap[b] - поэтому на след итерации мы вытаскиваем уже другой список.
still_alive вне форума Ответить с цитированием
Старый 20.12.2011, 04:31   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Причем тут it? Меняется мэп. А именно раньше там по ключу "а" лежало одно значение, а потом мы туда положили myMap[b] - поэтому на след итерации мы вытаскиваем уже другой список.
действительно...
_Bers вне форума Ответить с цитированием
Старый 20.12.2011, 11:29   #8
Anarios
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Причем тут it? Меняется мэп. А именно раньше там по ключу "а" лежало одно значение, а потом мы туда положили myMap[b] - поэтому на след итерации мы вытаскиваем уже другой список.
Да, спасибо большое, вчера в пять утра и сам заметил что в цикле меняю мэп который на следующей итерации использую для сравнения.
Anarios вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ map Filipa Помощь студентам 1 13.01.2011 12:07
проблема с пониманием map Amadeo Общие вопросы C/C++ 1 08.04.2010 15:01
Map Chartvit Общие вопросы C/C++ 1 01.12.2009 19:22
map Vladimir_D Общие вопросы C/C++ 1 17.10.2009 13:37