网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 后端开发 > C++ >

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

时间:2025-07-14 15:23

人气:

作者:admin

标签:

导读:关键词: QMap、erase、迭代器、遍历与删除 问题描述: 在使用 Qt 的 QMap 容器时,尝试在遍历过程中删除元素,在循环中调用 erase() 方法,虽然程序在正常运行时可能不会立即出现异常,...

关键词:

QMap、erase、迭代器、遍历与删除

问题描述:

在使用 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;

参考文献:



作者:薄暮知秋

本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/wsry/p/18983862

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信