Как правильно удалить предмет с карты по ключу?
Есть такая задача: удалить элементы из 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;