【问题标题】:How to correctly remove an item from the map by key?如何通过按键正确地从地图中删除项目?
【发布时间】:2026-01-07 15:40:01
【问题描述】:

有这样一个任务:从 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”

请告诉我怎么了?

【问题讨论】:

标签: c++ qt qmap


【解决方案1】:

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

返回与键 key 关联的值。

如果地图不包含有key key的项目,函数返回一个 默认构造值。如果有多个 key 项 map,返回最近插入的值。

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

使用迭代器打印地图:

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

【讨论】:

  • 另外,QMap 迭代器实现 operator* 以返回项目的值组件(与 std::map 的迭代器不同):cout &lt;&lt; *it &lt;&lt; endl;
  • 这里更好for (auto it = map.constBegin(); it != map.constEnd(); ++it)
  • @Moia range-for 循环会更好:for (auto &amp;value : map) cout &lt;&lt; value &lt;&lt; endl;
  • @RemyLebeau 我同意。我正在考虑打印 it.key() &lt;&lt; it.value() 迭代器有用的地方,但他实际上并没有写,所以 for range 循环肯定更好