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

本文介绍了Qt框架中的QMap容器,它用于存储键值对并支持自动排序。通过firstKey()和lastKey()方法,文章展示了如何在实际项目中如Modbus协议中利用QMap进行地址范围查找。QMap的排序特性使得它在处理有序数据时非常便捷。


QMap介绍

QMap是Qt框架中的一个关联容器类,用于存储键值对。
Q其内部是有序的,根据key的值进行升序排序。
使用QMap时会根据key值自动排序,内部实现为红黑树,如下:
红黑树
因此其插入、删除和查找等操作的平均时间复杂度都是O(log n),其中n是QMap中元素的数量。

QMapfirstKey()lastKey()方法会分别返回该映射中第一个和最后一个键的最小值和最大值。

QMap中,键(key)是唯一的,并且按键的升序进行排序。
重复insert()同一个(key)时,新的(value)会覆盖旧的(value),如果需要一个键对应多个值时,需要使用QMultiMap,这里就不对QMultiMap进行介绍了。
QMapfirstKey()方法返回的是映射中第一个键,也就是最小的键。而lastKey()方法返回的是映射中最后一个键,也就是最大的键。所以如果(key)值为数字的话,可以很方便的通过QMap进行排序。

示例代码

以下是示例代码,展示了如何使用firstKey()lastKey()方法:


#include <QMap>
#include <iostream>
int main() 
{    
		QMap<int, std::string> map;
    map[5] = "five";
    map[3] = "three";
    map[8] = "eight";
    map[2] = "two";
    map[4] = "four";
    std::cout << "First key: " << map.firstKey() << std::endl;
  // 输出:First key: 2
    std::cout << "Last key: " << map.lastKey() << std::endl;
   // 输出:Last key: 8
    return 0;
}

在这个例子中,我们创建了一个QMap对象,并插入了一些键值对。然后,我们分别使用firstKey()lastKey()方法获取了第一个和最后一个键,并打印输出它们。

实际使用

最近在使用Modbus协议时,创建了一个以地址为key的Map
最后通过Modbus读取多个寄存器时正好可以使用firstKey()lastKey()方法查询最大和最小地址,然后算出地址长度,直接查询多个地址,使用起来还是很方便的。
代码如下:

//获取输入寄存器地址List 更新最大最小值
m_discreteInputRegisterAddressMin = m_ClickRunInMap.firstKey();
m_discreteInputRegisterAddressMax = m_ClickRunInMap.lastKey();
//获取线圈寄存器地址List 更新最大最小值
m_coilRegisterAddressMin = m_ClickRunOutMap.firstKey();
m_coilRegisterAddressMax = m_ClickRunOutMap.lastKey();
ModbusRequest request;
request.setFuncode(modbusProtocalInfo.readFunctionCodeInt());
request.setStartAddress(m_discreteInputRegisterAddressMin);
request.setValueCount(m_discreteInputRegisterAddressMax - m_discreteInputRegisterAddressMin + 1);

可以直接将一串地址数据全部读出来,再根据Map映射取出需要的地址上的数据进行业务处理。

总结

使用QMap可以很方便的进行排序,直接insert()就直接在QMap内部完成了数据排序,同时也能根据(key)值很方便的拿到对应(value)。所以在排序时,可以考虑使用QMap。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辣死那个胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值