#include <iostream>
#include <map>
int main(int argc, char** argv)
{
std::map<int, int> map;
map.emplace(1, 1);
auto reverse_iter = map.rbegin();
std::cout << reverse_iter->first << ", " << reverse_iter->second << std::endl;
map.emplace(2, 2);
std::cout << reverse_iter->first << ", " << reverse_iter->second << std::endl;
return 0;
}
Это печатает:Это правильное поведение? станд :: Карта итератора недействительности
1, 1
2, 2
Является ли это действительно то, что должно произойти, в соответствии со стандартом? Я не трогаю reverse_iter, но значение, на которое оно указывает, меняется. Я думал, что итераторы на std :: map должны быть в безопасности от вставки. Тем не менее, похоже, что решение reverse_iter не должно указывать на ценность, о которой я сказал, а скорее «что бы ни случилось в конце карты на данный момент времени».
Обновление: дальнейшая информация, в случае, если это имеет значение: похоже, что это не происходит с итераторами вперед (в любой ситуации, которую я могу найти), а моя версия gcc 5.1.1-4.
Будучи «аннулированных» и указывая на новые данные не то же самое, они? Это действительный указатель на последнюю пару в вашем контейнере. Эта пара просто изменилась. – tadman
Не происходит с итераторами вперед. Замените rbegin на начало и замените (2, 2) на (0, 0). И опять же, соответствует ли это стандартам? Потому что это действительно штопает неожиданно, это точно. – KarenRei
Правильно, первое, что вы положили на карту, не изменится. Однако последнее, что вы сделали, будет. – tadman