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

相关推荐
aramae4 小时前
模拟实现strcmp()(C语言)
c语言·开发语言·后端
泡海椒5 小时前
PDF 表格样式优化:jquick-pdf 边框、圆角、背景色
java·开发语言·pdf
Beyond_System|系统之外5 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55236 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
汉克老师7 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood7 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz7 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕7 小时前
进一步了解模板
c++
Bruce_Liuxiaowei8 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
aramae10 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他