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类似。

相关推荐
时间的拾荒人几秒前
CMake 常用命令详解:从版本声明到安装部署
c++·面试
叼烟扛炮16 分钟前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔1 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真1 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放1 小时前
Python基础语法练习题(75)
开发语言·python·学习
sycmancia2 小时前
Qml——Image和AnimatedImage使用
qt
starzy19902 小时前
Scala循环与判断:一切皆表达式的控制流
开发语言·人工智能·scala
starzy19902 小时前
Scala类和对象:从构造器到样例类的完整指南
开发语言·后端·scala
niucloud-admin3 小时前
NIUCLOUD PHP SAAS上门家政使用文档--服务订单:订单列表
开发语言·php
D e re k ZH3 小时前
P5025 [SNOI2017] 炸弹
c++·算法