查看: 52|回覆: 0

Qt问题记录002:QMap的erase陷阱,正常运行与调试模式结果不同

[複製鏈接]

1

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2009-6-12
發表於 2025-7-14 15:23:00 | 顯示全部樓層 |閲讀模式

摘要:
    Qt的QMap循环删除元素(erase),在运行时正常,在调试模式下报错,提供解决代码。

关键词:
    QMaperase、迭代器、遍历与删除

问题描述:

在使用 Qt 的 QMap 容器时,尝试在遍历过程中删除元素,在循环中调用 erase() 方法,虽然程序在正常运行时可能不会立即出现异常,但在调试模式下,可能会遇到错误或未定义行为。

Qt版本:5.14.2

代码如下:

点击折叠或展开代码
void test_map_erase()
{
    QMap<int, int> map;
    // 插入10条数据
    for (int i = 0; i < 10; ++i) {
        map.insert(i, i);
    }
    // 移除奇数
    for(auto it=map.begin();it!=map.end();++it)
    {
        if((it.key() % 2) == 1) {
            map.erase(it);
        }
    }
    qDebug() << map;
}

运行结果:

运行输出:

QMap((0, 0)(2, 2)(4, 4)(6, 6)(8, 8))

调试模式运行报错,如图:

image


修改后代码:

为避免运行和调试不一致,统一改为如下代码:

点击折叠或展开代码
void test_map_erase()
{
    QMap<int, int> map;
    // 插入10条数据
    for (int i = 0; i < 10; ++i) {
        map.insert(i, i);
    }
    // 移除奇数
    for(auto it=map.begin();it!=map.end();)
    {
        if((it.key() % 2) == 1) {
            it = map.erase(it);
        } else {
            ++it;
        }
    }
    qDebug() << map;
}

注意:

  1. for循环去掉++it:for(auto it=map.begin();it!=map.end(); )
  2. 满足情况移除时:it = map.erase(it);
  3. 其他情况不移除时:++it;

参考文献:

  • Qt::QMap在for循环中使用erase的用法注意
  • QMap 的增删改查
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部