当前位置: 首页 > news >正文

Qt工作总结06 < QMap<> 和QVector<QPair>、以及QPair<>和QMakePair<> >

QMap<type,type>和QVector<QPair<type,type>>区别和优缺点

—— 本文为学习笔记,如有疑问欢迎指出~


一、QMap<>和QVector<QPair<>>

1.  数据结构本质

① 底层实现:

  • QMap:红黑树(平衡二叉搜索树)
  • QVector<QPair>:动态数组

② 排序方式:

  • QMap:按键key自动排序
  • QVector<QPair>:保持插入顺序

③ 键唯一性:

  • QMap:自动去重
  • QVector<QPair>:允许重复键

④ 内存布局:

  • QMap:非连续内存
  • QVector<QPair>:连续内存

2. 推荐使用场景

二、 QMakePair<>和QPair<>

 1.  QPair< >

  • 定义:Qt提供的一个模板,用于存储一对值(eg: std::pair)
template <typename T1,typename T2> class QPair;
  • 构造:
// 直接构造
QPair<double, QString> valueLabel(3.14, "Pi");// 使用构造函数
QPair<double, QString> valueLabel = QPair<double, QString>(3.14, "Pi");
  • 存储\访问:存储两个值(first,second)
QPair<int, QString> pair(42, "Answer");
int a = pair.first;        // 42
QString b = pair.second;   // "Answer"
  • 优点:

        ① 类型安全,明确指定两个值的类型;
        ② 直接访问,通过 .firat和 .second直接访问成员;
        ③ 标准兼容,与Qt容器(如QVector、QList)无缝集成;
        ④ 内存高效,没有额外开销,只存储两个值。

  • 缺点: 

        ① 冗长,需要显示指定模板参数类型;
        ② C++ 11前不能使用自动类型推导;

2. QMakePair< >

  • 定义:是一个模板函数,用于创建QPair对象
template <typename T1, typename T2> 
QPair<T1, T2> qMakePair(const T1 &value1, const T2 &value2) {return QPair<T1, T2>(value1, value2);
}
  • 特点:

        ① 工厂函数:创建并返回QPair对象;
        ② 类型推导:自动推导模板参数类型;

  • 使用:
auto pair = qMakePair(42, "Answer");
  • 优点:代码简洁清晰
// 简洁写法
lst.append(qMakePair(value, label));
  • 缺点:

        ① 间接性:多一层函数调用;
        ② 类型模糊:可能不如显式指定精确;
        ③ C++ 11后有更简洁的方式替代如下

// C++11 替代写法
lst.append({value, label}); 

3. 对比

4. C++ 11及以后替代建议

// 列表初始化(最简洁)
lst.append({value, label});// 结构化绑定(C++17)
for (const auto &[val, lbl] : lst) {// 使用 val 和 lbl
}

5. 直接使用QPair的场景

// 当需要明确指定类型时(如类型转换)
lst.append(QPair<double, QString>(static_cast<double>(intValue), QString::number(intValue)
));// 当自动类型推导不符合预期时

相关文章:

  • 远程io模块在汽车流水线的应用
  • 【Python】Python办公自动化需要你了解什么?会什么?
  • AI 赋能 Java 开发:从通宵达旦到高效交付的蜕变之路
  • DD3118完整版参数规格书|DD3118 3.0读卡器控制方案|DD3118高速3.0读卡器芯片
  • BTREE存储结构
  • Android 10.0 勿扰模式开启关闭功能实现
  • Node.js:开启现代服务器端编程的新篇章
  • Odoo 17 在线聊天报错 “Couldn‘t bind the websocket...“ 的解决方案
  • 单链表专题
  • 我的世界进阶模组开发教程——制作机械动力附属模组
  • 避坑:启动sdk-c demo master需要注意的事情
  • 技术栈CMake的介绍和使用
  • 如何设计三高架构
  • TiDB 上线步骤是怎么样?怎么做到数据不丢失?怎么保证可靠性?
  • 火山引擎发布豆包大模型 1.6 与视频生成模型 Seedance 1.0 pro
  • cmake 编译grpc
  • Decode Valid Comma Only说明
  • linux引导过程与服务控制
  • 电流传感器在汽车中的应用:从BMS电池管理到电机控制的工程解析
  • day031-Shell自动化编程-数组与案例
  • 邮轮哪个网站是可以做特价/网站安全
  • 上街做网站/长沙市seo百度关键词
  • 做企业网站和邮箱/app001推广平台官网
  • 网站做好怎么开始做推广/小程序开发流程
  • 网站建设品牌公司推荐/郑州网站技术顾问
  • 帮助做APP的网站公司/国内搜索引擎大全