Как правильно удалить предмет с карты по ключу? - PullRequest
0 голосов
/ 30 января 2019

Есть такая задача: удалить элементы из 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 Ответ

0 голосов
/ 30 января 2019

Ссылка на 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;
...