std::map несколько итераторов, удаление и его значение
#include <stdio.h>
#include <iostream>
#include <map>
#include <string>
#include <stdlib.h>
using namespace std;
class Fix
{
};
int main()
{
map<int, Fix *> m;
Fix * f = new Fix();
m.insert( make_pair( 2, f) );
m.insert( make_pair( 3, f) );
map<int, Fix *>::iterator it = m.find(2);
map<int, Fix *>::iterator it1 = m.find(2);
m.erase(it);
// Will Create problem
// m.erase(it1);
// Still value is there
// So from the map node, iterator copy its value ?
printf("%d\n", it->first);
printf("%d\n", it1->first);
}
У меня карта содержит две записи, а также два итератора, указывающие на одну и ту же запись. Стерли одну запись с карты с помощью Iterator1. Удаление сообщения по-прежнему сохраняют значения Iterator1 и Iterator2.
Вопросы
- Итератор указывает на узел карты (красное черное дерево)
- Итератор копирует ключ и значение из узла во время итерации? Из-за этого он сохраняет значение даже после удаления записи с карты.
2 ответа
За std::map::erase
использование этого метода на итераторе имеет следующие эффекты:
удаляет указанные элементы из контейнера
ссылки и итераторы на стертые элементы становятся недействительными. Другие ссылки и итераторы не затрагиваются.
Таким образом, вы не можете использовать it1
после того, как вы стерли it
, даже если it1
все еще может указать на "теперь недействительным" предыдущую память по совпадению.
Пожалуйста, отметьте принятый ответ.
Bits_international верен в своем объяснении, измените код в своей основной функции следующим образом.
map<int, Fix *> m;
Fix * f = new Fix();
m.insert( make_pair( 2, f) );
m.insert( make_pair( 3, f) );
map<int, Fix *>::iterator it = m.find(2);
it = m.erase(it); //you can reuse it after this call
map<int, Fix *>::iterator it1 = m.find(2);
it1 = m.erase(it1); //you can reuse it1 after this call
printf("%d\n", it->first);
printf("%d\n", it1->first);