QMap介绍
QMap是Qt框架中的一个关联容器类,用于存储键值对。
Q其内部是有序的,根据key的值进行升序排序。
使用QMap时会根据key值自动排序,内部实现为红黑树,如下:

因此其插入、删除和查找等操作的平均时间复杂度都是O(log n),其中n是QMap中元素的数量。
QMap的firstKey()和lastKey()方法会分别返回该映射中第一个和最后一个键的最小值和最大值。
在QMap中,键(key)是唯一的,并且按键的升序进行排序。
重复insert()同一个(key)时,新的(value)会覆盖旧的(value),如果需要一个键对应多个值时,需要使用QMultiMap,这里就不对QMultiMap进行介绍了。
在QMap中firstKey()方法返回的是映射中第一个键,也就是最小的键。而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。
本文介绍了Qt框架中的QMap容器,它用于存储键值对并支持自动排序。通过firstKey()和lastKey()方法,文章展示了如何在实际项目中如Modbus协议中利用QMap进行地址范围查找。QMap的排序特性使得它在处理有序数据时非常便捷。

2270

被折叠的 条评论
为什么被折叠?



