Решили добавить тесты для компилятора clang помимо gcc. В итоге в одной функции получаем бесконечный цикл, и в минимальном примере размер карты не выводится. Почему так?
std::unordered_multimap<int, int> map = {{1, 2},
{1, 5},
{2, 3},
{3, 7},
{5, 1}}; // какая-то инициализация
for (auto&& key_value_pair : map) {
auto[old_key, old_value] = key_value_pair;
auto new_value = old_value + 1; // какое-то вычисление для нового значения
map.insert({old_key, new_value});
}
std::cout << map.size();
Изменять контейнер во время прохода по нему с помощью ranged for loop - плохая идея.
Конкретно в случае unordered_multimap
есть две проблемы.
Во-первых, .insert()
может поставить элемент как перед текущим (т.е. перед key_value_pair
), так и после, в зависимости от реализации.
Если unordered_multimap
решит каждый раз будет ставить элемент после текущего, то цикл никогда не закончится.
Во вторых, что более важно:
std::unordered_multimap::insert()
If rehashing occurs due to the insertion, all iterators are invalidated. Otherwise iterators are not affected.
Rehashing рано или поздно произойдет при добавлении очередного элемента.
Тогда вы получите неопределенное поведение, потому что итератор, который используется ranged for для прохода по unordered_multimap
, перестанет быть валидным.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Видел в некоторых исходниках конструкцию типа Function<DWORD>(123)Подскажите пожалуйста:
Почему данный код не определяет количество слов? С другими символами работает, а с пробелом никак не хочет
Необходимо разработать UDP-приёмник, принимающий строку данных от сервера на другом ПК, и помещающий специнформацию в окно в соответствии...
Для кода нужно на вывести в цикле While, внутри оператора if время на ПК