对QMap中的key进行自定义排序

QT-QMap和QHash解析 QMap QMap原型为class QMap <K,T>,其中K表示键,T表示值,K和T属于映射关系. QMap会根据K来自动进行升序键排序 QMap中的K类型必须重载operator < QMap常用函数如下: const Key QMap::key ( const T & value ); //通过值来找键,若未找到则返回0,由于只对K键进行排序,所以该函数不是快速查找 const T QMap::value ( c 阅读详情
AI摘要

本文介绍如何通过重载比较运算符来实现QMap中的自定义类型键按特定规则排序,包括升序和降序示例。

QMap的默认排序是按照key的升序进行排序。

如果我们想改变QMap的key的排序规则,则需要提供operator<()

QMap’s key type must provide operator<(). QMap uses it to keep its items sorted, and assumes that two keys x and y are equal if neither x < y nor y < x is true.

Qt帮助文档给的例子:

 #ifndef EMPLOYEE_H
  #define EMPLOYEE_H

  class Employee
  {
  public:
      Employee() {}
      Employee(const QString &name, const QDate &dateOfBirth);
      ...

  private:
      QString myName;
      QDate myDateOfBirth;
  };

  inline bool operator<(const Employee &e1, const Employee &e2)
  {
      if (e1.name() != e2.name())
          return e1.name() < e2.name();
      return e1.dateOfBirth() < e2.dateOfBirth();
  }

  #endif // EMPLOYEE_H

也可以把operator<写成类成员函数。

自己写的一个例子:

在Qt中新建一个控制台程序:

main.cpp中

#include <QCoreApplication>
#include <QMap>
#include <QDebug>

class MyString
{
public:
    explicit MyString(const QString &str_) : str(str_) {}

    QString str;
    //重载操作符
    bool operator < (const MyString& other) const
    {
        return str > other.str;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QMap<MyString,int> stringMap;
    //初始化数据
    //数据插入容器
    stringMap.insert(MyString("aa"), 4);
    stringMap.insert(MyString("bb"), 3);
    stringMap.insert(MyString("cc"), 2);
    stringMap.insert(MyString("dd"), 1);

    QMapIterator<MyString, int> iter(stringMap);
    while (iter.hasNext()) {
        iter.next();
        qDebug() << iter.key().str << ": " << iter.value() << Qt::endl;
    }

    return a.exec();
}

运行结果:
在这里插入图片描述
就变成了key是按照QString进行降序排列。

如果代码改成这样:

class MyString
{
public:
    explicit MyString(const QString &str_) : str(str_) {}

    QString str;
    //重载操作符
    bool operator < (const MyString& other) const
    {
        return str < other.str;  //这里就改成小于号,QMap里的排序就成了升序和QMap<QString, int>默认排序一样了
    }
};

我再写一个按照int降序排序的例子:

#include <QCoreApplication>
#include <QMap>
#include <QDebug>

class MyInt
{
public:
    explicit MyInt(const int &value_) : value(value_) {}

    int value;
    //重载操作符
    bool operator < (const MyInt& other) const
    {
        return value > other.value;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QMap<MyInt, QString> intMap;
    //初始化数据
    //数据插入容器
    intMap.insert(MyInt(1), QString("aa"));
    intMap.insert(MyInt(2), QString("bb"));
    intMap.insert(MyInt(3), QString("cc"));
    intMap.insert(MyInt(4), QString("dd"));

    QMapIterator<MyInt, QString> iter(intMap);
    while (iter.hasNext()) {
        iter.next();
        qDebug() << iter.key().value << ": " << iter.value();
    }

    return a.exec();
}

运行结果:
在这里插入图片描述
以上只是为了让举例的代码简单明了,没有写成get和set的方式对类成员变量进行操作,在项目中建议写出get和set的方法对类成员变量进行操作。

QT基础教程(QMap和QHash) 本篇文章将为大家讲解QT中两个非常重要的类:QMap和QHash。QMap和QHash都是Qt框架中用于存储键值对的数据结构,它们提供了快速的查找、插入和删除操作,但在某些方面有一些不同之处。使用QMap当您需要按顺序存储和访问键值对,或者需要使用自定义排序准则。使用QHash当您需要快速查找、插入和删除键值对,并不关心元素的顺序。本篇文章就讲解到这里,下篇文章继续讲解。 阅读详情

相关推荐

QMap之自定义Key和Value

为什么要自定义QMap的 key和value呢?因为在某些应用场景,基本数据类型的key和value并不能满足要求,比如座位在第几行、第几列,座位上人的姓名、职务;二维坐标系中散点的横坐标、纵坐标,散点的id、result。即key和value是一种多对多的关系。需要注意的是自定义的CustomKey中要重载运算符

草上爬的博客 3418

QMap的排序

QMap的升序排序,巧妙避开默认排序规则

ken2232的博客 1796

如何用python开发“跳一跳”游戏【附源码】

jump_start_time = pygame.time.get_ticks() # 记录跳跃开始时间。jump_duration = current_time - jump_start_time # 计算跳跃持续时间。current_time = pygame.time.get_ticks() # 获取当前时间。jump_velocity = -15 # 设置跳跃的初始速度。# 如果小球跳跃结束,重置跳跃状态。# 根据跳跃持续时间计算跳跃高度。# 移除超出屏幕的障碍物。

helloshili2011的博客 2496

QMap学习笔记之使用QMap进行排序

QMap自动排序

zy1551的博客 3863

一起学习Avalonia(十三)

Avalonia 前面已经简单介绍了一下相关开发,有一个系统的了解。 到今天Avalonia已经基本成熟,但是扩展支持的还是不可能达到大企业的,我估计这也不可能。考虑了下,微软的MAUI框架可能会普及性更高,Avalonia也是我无意间知道的。 微软毕竟是会宣讲的全球。并且微软全球研发投入很大,全部专职开发,这种速度当然大。但是MAUI根据计划,可能还要很长时间,而且是社区支持Linux,估计时间更久。这不能适应现在的国产化开发。 预计一段时间还是需要Avalonia作为优先。当前Avalonia使

jinyuttt的专栏 4086

PWM与光耦的完美联姻:低成本4-20mA转换方案揭秘

本文揭秘了PWM与光耦结合的低成本4-20mA转换方案,适用于工业自动化领域。通过PWM信号控制输出电流,光耦实现电气隔离,该方案成本低廉、电路简单且隔离可靠。文章详细介绍了两种经典电路实现方案,包括四光耦线性模式方案和PWM控制LM317方案,并提供了实战技巧与优化策略,帮助中小企业和电子DIY爱好者构建经济高效的4-20mA转换系统。

weixin_29229055的博客 536

QMap和QHash自动排序问题及解决方案

有时候想要获得可以按顺序读写的键值对,此时QMap和QHash并不能够满足我们需求。按任意顺序插入QMap,重复实验,Qmap都会根据Key自动排序。按任意顺序插入QHash,重复实验,QHash随机顺序。

weixin_52990711的博客 4401

STM32-printf重定向串口输出

声明 本文内容转载至https://www.mculover666.cn/posts/2251182441/ 1.printf与fputc printf 定义在 <stdio.h> 头文件中,如下: int printf(const char *format, ...); printf 函数根据 format 字符串给出的格式打印输出到 stdout(标准输出)中,当然,printf 函数是不会一个字符一个字符去输出,它会调用更底层的 I/O 函数:fputc去逐个字符打印。 fputc 也定

qq_41215167的博客 4539

QMap的升序排序,巧妙避开默认排序规则。

通过以上规律当我们需要顺序排序时,就不要将key值的类型定义为QString、QByteArray等字符串类型,而需要定义为int型。可以看出多个字符的key值,首字母排序后,如果首字母相同,则从第二个字母按照ASCII顺序来排序。从插入规则,对照ASCII码表不难看出map的排序都是按照key值首字母的顺序来排序的,结论:QMap的升序排序是指对key值的首字母的Ascii码顺序来确定的。以下通过一个示例来看看QMap怎么排序的。

weixin_43246170的博客 3580

YOLOv11 模型改进:利用新型损失函数实现精度跃升(含代码全解析)

在目标检测领域,损失函数的选择直接决定模型的精度上限。某自动驾驶公司将 YOLOv11 原有损失替换为新型损失后,障碍物检测 mAP 提升 10%,夜间场景误检率降低 22%;某物流分拣项目中,采用新损失的 YOLOv11 模型对小包裹的识别准确率从 82% 升至 96%。如果你也在为模型精度瓶颈、样本不平衡问题困扰,这篇教程将带你掌握 YOLOv11 损失函数的进阶技巧,真正帮你在检测性能上实现突破。损失函数是模型训练的“指南针”,它定义了模型“学习的方向”。传统损失(如 BCE、Focal Loss)在

m0_71589036的博客 714

【UVM实战】第七章:UVM中的寄存器模型(1)寄存器模型简介

寄存器模型简介~

悟已往之不谏 知来者之可追 2070

QSettings 对 QMap中的 key进行自定义排序 (****)

对QMap中的key进行自定义排序

ken2232的博客 1412

验证方法、符合性方法与设计保证的关系

未来,随着适航标准和工程实践的不断演进,验证与符合性方法将持续优化,以应对日益复杂的系统设计需求。设计保证过程中的验证活动具有双重作用,既用于设计过程的质量控制和风险管理,又作为适航符合性方法的重要支持材料。在未来的航空电子系统开发中,进一步优化设计保证与验证活动的协同作用,将有助于应对日益复杂的工程挑战,推动航空安全技术的发展。为了全面理解这二者之间的关系,本章将系统说明设计保证过程中的验证活动如何既服务于设计保证,又作为符合性方法中的核心证明材料。最终,通过功能测试和环境测试验证硬件的实际性能。

qq_41854911的博客 554

qt中QMap的key值为结构体时,正确重写<方式

qmap中key值需要用到结构体,对结构体里多个值进行匹配,全部成功输出才value值。

FOX2N的博客 1620

2023年全国职业院校技能大赛 网络系统管理服务模块 Linux部分讲解

网络系统管理,Linux,服务部署,Chinaskills,2023国赛

weixin_62926639的博客 1549

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

QHash & QMap 的顺序问题 (***)

QHash & QMap 的顺序问题

ken2232的博客 2516

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

关于重载操作符

今天用QMap时,key是struct, 重载了 正确写法: bool operator

XianZaiJinXingShi的专栏 641

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

QMap详解

QMap详解 QMap是Qt的一个模板类,它是基于红黑树算法的一套字典。 QMap<Key,T>是Qt容器类型的一种,它通过(Key, value)存储一对值,并通过Key可以查找与之关联的value的值。 QMap和 QHash是很相似的,不同的地方是: QHash的查找速度比QMap要快很多。 在对QHash进行迭代时,这些项是任意排序的。在QMap中,项总是按键排序。 QHash的关键类型必须提供运算符==()和全局QHash(key)函数。QMap的关键类型必须提供操作符<(

qq_21291397的博客 4万+

利用QMap的自动排序特性获取未使用的Key

利用QMap的自动排序特性获取未使用的Key前提背景算法提点 前提 1. 当前需求里的Key是有规律的,类似前key与key直接间隔一样 背景 1. 因为QMap具有自动key排序的特性,故而可以进行利用 2. 时间复杂度可大O(n), n是查找次数, n 必然小于等于 QMap.size() 算法 int newKey = 0; if(idNameMap.size() > 0...

Tiany 2440

Qt 使用自定义的数据类型作为QMap的Key(Class)

自定义数据类型时,为了让自定义数据能作为键值放入QMap<key,Value>中,因此对自定义的数据类型PointData使用宏Q_DECLARE_METATYPE,并对运算符进行重载以达到被QMap键值规则的目的。

zjgo007的专栏 5092

qmap扩展

扩展。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 943

QMap排序方法运用实例

QVector&lt;QPointF&gt; ReadSonicPoint::sortSonicPoint(QVector&lt;QPointF&gt; befPointVector) //把x轴的值从小到大排序 { QVector&lt;QPointF&gt; modPointVector; QMap&lt;double, double&gt;sonicMap; //利用QMap自动排序 ...

MusicMan 1万+

QMap

QMap QMap是Qt容器类型的一种,它通过(Key, value)存储一对值,并通过Key可以查找与之关联的value的值。 QMap和QHash是很相似的,不同的地方是: - QHash的查找速度比QMap要快很多。 - 在对QHash进行迭代时,这些项是任意排序的。在QMap中,项总是按键排序。 - QHash的关键类型必须提供运算符==()和全局QHash(key)函数。QMa

Q男 1万+

Qmap应用大全

1.QMap是基于红黑树实现的,因此查找、插入和删除操作都具有O(log n)的时间复杂度2.QMap可以自动对键进行排序,并且支持自定义排序函数 3.QMap支持多个值对应一个键 4.支持迭代器,可以方便地遍历所有元素复制全文 散列表(Hash Table,也叫哈希表)是一种数据结构,Qhash使用哈希函数将键映射到桶(bucket)中,以实现快速查找、插入和删除操作。散列表的主要优点是查找速度快,平均时间复杂度为 O(1)。在遍历QHash时,元素的顺序是任意的。在QMap中,元素总是按键排序了的。

热土程序园,利他愉己~ 1915

QMap排序

QMap排序

FreeLikeTheWind的博客 1039
上一篇: std::map删除某个或者某些元素的示例
下一篇: 利用std::map和std::greater对key进行降序排列
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值