карта / набор итераторов не допускает увеличения ошибки в C ++ - PullRequest
2 голосов
/ 19 марта 2012

Когда я выполняю следующий код, я получаю итераторы карты / набора без увеличения числа ошибок.

typedef std::multimap<int, int> MapType;

assgnt::MapType my_map;
assgnt::MapType::iterator it;
for(it = my_map.begin(); it != my_map.end(); )
{
    my_map = obj1.addGoodNeighbours(it->first, it->second, my_map); 
    ++it;
}

Пожалуйста, помогите

Ответы [ 2 ]

6 голосов
/ 19 марта 2012

Я не знаю, что такое assgnt::MapType, но назначение другого assgnt::MapType на my_map внутри цикла for не может быть хорошей вещью:

my_map = obj1.addGoodNeighbours(it->first, it->second, my_map); 

Вы должны хотя бы переназначить итератор:

for(it = my_map.begin(); it != my_map.end(); ++it;) {
    my_map = obj1.addGoodNeighbours(it->first, it->second, my_map); 
    it = my_map.begin();
}

Но я считаю, что код далек от правильного.Вы в основном разрушаете структуру, которую вы повторяете, итерируя ее.

РЕДАКТИРОВАТЬ : Ну, мы знаем, что такое MapType сейчас.Все вышеперечисленное все еще верно.Вы не можете просто переназначить свои карты, повторяя их.

1 голос
/ 19 марта 2012

Вы изменяете карту во время итерации по ней. Это не поддерживается std контейнерами и поэтому является ошибкой в ​​вашей программе. В настоящее время вы полностью перезаписываете объект, но более подробно даже добавление элементов не поддерживается.

Вы получаете эту ошибку, вероятно, потому что вы находитесь в режиме отладки, и я не удивлюсь, если это просто произойдет сбой в работе.

Для достижения того же эффекта вы можете использовать временную карту:

assgnt::MapType my_map;
assgnt::MapType tmp;

for (auto it = my_map.begin(); it != my_map.end(); ++it) {
     // you need to change addGoodNeighboors to add elements in place instead of creating a new map
     obj1.addGoodNeighbours(tmp, it->first, it->second, my_map);  
}

my_map.insert(begin(tmp), end(tmp));
...