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.

Вопросы

  1. Итератор указывает на узел карты (красное черное дерево)
  2. Итератор копирует ключ и значение из узла во время итерации? Из-за этого он сохраняет значение даже после удаления записи с карты.

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);
Другие вопросы по тегам