QT的几种QMap插入顺序说明

 更新时间:2025年09月07日 14:04:59   作者:冷凝女子  
本文主要介绍了QT的几种QMap插入顺序说明,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1 在QMap中按顺序插入QString类型的键

QMap本身就会自动按键排序,但对于QString类型的键,默认是按照字母顺序(字典序)排序的。如果你需要自定义排序顺序,可以通过以下几种方法实现:

1.1 使用默认的字母顺序排序

如果你只需要普通的字母顺序排序,QMap已经自动实现了:

QMap<QString, int> map;
map.insert("banana", 2);
map.insert("apple", 1);
map.insert("cherry", 3);

// 遍历时会自动按字母顺序输出:apple, banana, cherry
for (auto it = map.begin(); it != map.end(); ++it) {
    qDebug() << it.key() << ":" << it.value();
}

1.2 自定义排序规则

如果需要自定义排序顺序,可以提供一个比较函数:

// 自定义比较函数 - 按字符串长度排序
struct LengthCompare {
    bool operator()(const QString &a, const QString &b) const {
        return a.length() < b.length();
    }
};

// 使用自定义比较函数的QMap
QMap<QString, int, LengthCompare> lengthOrderedMap;
lengthOrderedMap.insert("banana", 2);
lengthOrderedMap.insert("apple", 1);
lengthOrderedMap.insert("cherry", 3);

// 遍历时会按字符串长度输出:apple, banana, cherry

1.3 保持插入顺序

如果需要保持插入顺序而不是排序顺序,可以考虑:

方案1:使用QMap+QList组合

QMap<QString, int> map;
QList<QString> insertionOrder;

void insertInOrder(const QString &key, int value) {
    if (!map.contains(key)) {
        insertionOrder.append(key);
    }
    map.insert(key, value);
}

// 遍历时按插入顺序
for (const QString &key : insertionOrder) {
    qDebug() << key << ":" << map.value(key);
}

方案2:使用QHash+QList组合

QHash<QString, int> hash;
QList<QString> insertionOrder;

void insertInOrder(const QString &key, int value) {
    if (!hash.contains(key)) {
        insertionOrder.append(key);
    }
    hash.insert(key, value);
}

方案3:使用Qt 5.14+的QSequentialIterable容器

#include <QSequentialIterable>
// 但这不是一个独立的容器,需要结合其他方法使用

1.4 使用第三方库或C++17的std::map

如果你可以使用C++17,可以考虑:

#include <map>
#include <string>

std::map<std::string, int, YourCustomCompare> orderedMap;

总结

1. 默认字母顺序:直接使用QMap<QString, T>
2. 自定义排序:提供比较函数作为QMap的第三个模板参数
3. 保持插入顺序:使用QMap+QList或QHash+QList组合
4. C++17选项:考虑std::map with custom comparator

对于大多数情况,QMap的默认排序行为已经足够,如果需要保持插入顺序,组合使用QList来记录顺序是最常见的解决方案。

到此这篇关于QT的几种QMap插入顺序说明的文章就介绍到这了,更多相关QT QMap插入顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • opencv3/C++图像边缘提取方式

    opencv3/C++图像边缘提取方式

    今天小编就为大家分享一篇opencv3/C++图像边缘提取方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C语言数字图像处理之直方图均衡化

    C语言数字图像处理之直方图均衡化

    这篇文章主要为大家详细介绍了C语言数字图像处理之直方图均衡化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 详解C++ string常用截取字符串方法

    详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • C++中 string 中的常用方法使用心得

    C++中 string 中的常用方法使用心得

    这篇文章主要介绍了C++中 string 中的常用方法使用心得,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C语言科学计算入门之矩阵乘法的相关计算

    C语言科学计算入门之矩阵乘法的相关计算

    这篇文章主要介绍了C语言科学计算入门之矩阵乘法的相关计算,文章中还介绍了矩阵相关的斯特拉森算法的实现,需要的朋友可以参考下
    2015-12-12
  • QTableWidget设置只让某一列可编辑的实现

    QTableWidget设置只让某一列可编辑的实现

    本文介绍了如何将QTableWidget的某一列设置为可编辑,以便用户可以输入自定义数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • C语言大厂面试技巧及strcpy()函数示例详解

    C语言大厂面试技巧及strcpy()函数示例详解

    这篇文章主要为大家介绍了C语言面试技巧,以strcpy()函数为示例进行分析详解,有需要冲刺大厂的朋友们可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • 浅谈C++中的引用和指针

    浅谈C++中的引用和指针

    这篇文章主要介绍了浅谈C++中的引用和指针,C++允许为已定义的变量再起一个新的别名,称为变量的引用名,引用名看起来像是一个变量名,但它是一种特殊变量,称为引用变量,或简称为引用,需要的朋友可以参考下
    2023-08-08
  • VS2017+Qt5+Opencv3.4调用摄像头拍照并存储

    VS2017+Qt5+Opencv3.4调用摄像头拍照并存储

    本文主要介绍了VS2017+Qt5+Opencv3.4调用摄像头拍照并存储,实现了视频,拍照,保存这三个功能。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++中list的使用场景详解

    C++中list的使用场景详解

    这篇文章主要介绍了C++标准库中的`std::list`容器,包括其内部结构、与其它容器的对比、核心使用场景、性能分析、特殊应用场景、使用陷阱与最佳实践,需要的朋友可以参考下
    2025-05-05

最新评论