Как правильно удалить предмет с карты по ключу?

Есть такая задача: удалить элементы из QMap по ключу.

Я делаю это с этим кодом.

QMap <int, QString> map;
map.insert(0, "0");
map.insert(1, "1");
map.insert(2, "2");
map.insert(3, "3");
map.insert(4, "4");
map.insert(5, "5");

qDebug() << "Before:";
for (auto i = 0; i < map.size(); i++)
    qDebug() << map.value(i) << "\t";
qDebug() << "--------------";

map.remove(3);

qDebug() << "After:";
for (auto i = 0; i < map.size(); i++)
    qDebug() << map.value(i) << "\t";

У меня есть следующий результат:

До: "0", "1", "2", "3", "4", "5".


После: "0" "1" "2" "" "4"

Но я ожидаю, что результат будет:

До: "0", "1", "2", "3", "4", "5".


После:

"0" "1" "2" "4" "5"

Пожалуйста, скажите мне, что не так?

1 ответ

Решение

Справка о QMap::value(const Key):

Возвращает значение, связанное с ключом ключа.

Если карта не содержит элемента с ключом key, функция возвращает значение, созданное по умолчанию. Если на карте есть несколько элементов для ключа, возвращается значение последнего добавленного элемента.

Начальный размер карты 6, после удаления элемента с key = 3 размер карты 5. Вы перебираете от 0 до 5, затем value(3) создает объект QString по умолчанию, потому что элемент с 3 в качестве ключа не существует, поэтому вы видите "" как вывод. Итак, ваша проблема в том, что количество итераций не соответствует ключу на вашей карте.

Распечатать карту с помощью итераторов:

for (auto it = map.begin(); it != map.end(); ++it)
  cout << it.value() << endl;
Другие вопросы по тегам