如何正确地从地图上删除一个项目?

时间:2019-01-30 06:32:43

标签: c++ qt qmap

有一个任务:通过键从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 :(得分:4)

关于QMap::value(const Key)的参考文献:

  

返回与键相关的值。

     

如果地图不包含带有键的项,则该函数返回   默认构造的值。如果有多个项目要输入   映射,则返回最近插入的一个的值。

映射的初始大小为6,在删除映射大小为key = 3的项为5后。您要从0迭代到5,然后value(3)构造默认的QString对象,因为以3为键的项不存在,这就是为什么您看到“”作为输出的原因。 因此,您的问题是迭代次数与地图中的键不匹配。

使用迭代器打印地图:

for (auto it = map.begin(); it != map.end(); ++it)
  cout << it.value() << endl;