Qt:容器类

  • Qt的容器类比STL更轻巧、安全和易于使用。
  • 隐式共享和可重入的,而且它们进行了速度和存储优化,因此可以减少可执行文件的大小。
  • 线程安全,也就是说它们作为只读容器时可以被多个线程访问。

容器类是基于模板的类,可以是简单类型,也可以是QStirng、QDate等类,但不能是QObject或任何其子类。T必须是一个可赋值的类型,即T必须提供一个缺省的构造函数,一个可赋值构造函数和一个赋值运算符。

Qt的容器分类:顺序容器(sequential containers)和关联容器(associative containers)

顺序容器

QList、QLinkedList、QVector、QStack、QQuene

QList

QList<T>是以数组形式实现,在前面或后面添加数据块,可以以下标的形式访问数据。

用于添加、插入、替换、移动、删除数据项的函数:

  • insert()
  • replace()
  • removeAt()
  • move()
  • swap()
  • append()
  • prepend()
  • removeFirst()
  • removeLast()

QLinkedList

QLinkedList<T>是链式列表,数据项不是用连续的内存存储的,它基于迭代器访问数据项,并且插入和删除数据项的操作时间相同。

除了不提供基于下标索引访问数据项外,其他接口与QList基本相同

QVector

QVector<T>提供动态数组的功能,以下标索引访问数据项。

QVector<T>性能比QList<T>高,因为QVector<T>的数据项是连续存储的。

QStack

QQueue

队列

关联容器

QMap、QMultiMap、QHash、QMultiHash、QSet

!Note

QMultiMap和QMultiHash支持一个键关联多个值,QHash和QMultiHash使用散列函数进行查找,查找速度更快。

QSet

基于散列表的集合模板类,存储数据的顺序是不定的,查找值的速度非常快。内部是使用QHash实现的。

cpp 复制代码
QSet<QString> set;
set << "dog" << "cat" << "tiger";
// 测试是否存在某个值
if(!set.contains("cat)){
	...
}

QMap

QMap<Key, T>提供一个字典(关联数组),一个键映射到一个值。QMap按照键的顺序存储数据,如果不在乎顺序,使用QHash更快。

实例代码:

cpp 复制代码
QMap<QString, int> map;
// 进行赋值
map["one"] = 1;
map["two"] = 2;

// 使用insert()函数进行赋值
map.insert("three", 3);
// 使用remove()函数移除一个键值对
map.remove("one");

// 可以使用 [] 或者 value() 函数查找值
int num1 = map["two"];
int num2 = map.value("two");
// 如果没有找到值,设置返回的缺省值
int num 3 = map.value("one", 101);

QMultiMap

QMap的子类,用于处理多值映射的类。

多值映射:一个键对应多个值。

cpp 复制代码
QMultiMap<QString, int> map1, map2, map3;
map1.insert("plenty", 100);
map1.insert("plenty", 1000);
map2.insert("plenty", 500);
map3 = map1 + map2;

// 各个map里面的数量
// map1.size() = 2
// map2.size() = 1;
// map3.size() = 3;

QMultyMap不能使用[]操作符,使用 value() 函数可以访问最新插入的单个值。如果要获取一个键对应的所有值,使用 values() 函数,返回QList<T>类型。

QHash

QHash是基于散列表来实现字典功能的模板类,有非常快的查找速度。

QHash与QMap的区别:

  • QHash比QMap查找速度快
  • 在QMap上遍历时,数据项是按照键排序的,QHash的数据项是任意顺序的。
  • QMap的键必须提供<运算符,QHash的键必须提供==运算符和一个名称为qHash()的全局散列函数

QMultiHash

用于处理多值映射的类,用法与QMultiMap类似。

相关推荐
韶博雅6 分钟前
emcc24ai
开发语言·数据库·python
yongui4783423 分钟前
C# 与三菱PLC通讯解决方案
开发语言·c#
2501_9333295524 分钟前
技术架构深度解析:Infoseek舆情监测系统的全链路设计与GEO时代的技术实践
开发语言·人工智能·分布式·架构
Tong Z28 分钟前
常见的限流算法和实现原理
java·开发语言
凭君语未可31 分钟前
Java 中的实现类是什么
java·开发语言
wearegogog12333 分钟前
离散系统参数辨识与广义预测控制MATLAB实现
开发语言·matlab
史迪仔011236 分钟前
[QML] QML IMage图像处理
开发语言·前端·javascript·c++·qt
还在忙碌的吴小二1 小时前
Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code
java·开发语言·spring boot·后端·spring