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)
cpp
template <typename T1,typename T2> class QPair;
- 构造:
cpp
// 直接构造
QPair<double, QString> valueLabel(3.14, "Pi");
// 使用构造函数
QPair<double, QString> valueLabel = QPair<double, QString>(3.14, "Pi");
- 存储\访问:存储两个值(first,second)
cpp
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对象
cpp
template <typename T1, typename T2>
QPair<T1, T2> qMakePair(const T1 &value1, const T2 &value2) {
return QPair<T1, T2>(value1, value2);
}
- 特点:
① 工厂函数:创建并返回QPair对象;
② 类型推导:自动推导模板参数类型;
- 使用:
cpp
auto pair = qMakePair(42, "Answer");
- 优点:代码简洁清晰
cpp
// 简洁写法
lst.append(qMakePair(value, label));
- 缺点:
① 间接性:多一层函数调用;
② 类型模糊:可能不如显式指定精确;
③ C++ 11后有更简洁的方式替代如下
cpp
// C++11 替代写法
lst.append({value, label});
3. 对比

4. C++ 11及以后替代建议
cpp
// 列表初始化(最简洁)
lst.append({value, label});
// 结构化绑定(C++17)
for (const auto &[val, lbl] : lst) {
// 使用 val 和 lbl
}
5. 直接使用QPair的场景
cpp
// 当需要明确指定类型时(如类型转换)
lst.append(QPair<double, QString>
(static_cast<double>(intValue),
QString::number(intValue)
));
// 当自动类型推导不符合预期时