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

相关推荐
virus59454 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
一匹电信狗4 小时前
【LeetCode_547_990】并查集的应用——省份数量 + 等式方程的可满足性
c++·算法·leetcode·职场和发展·stl
初次见面我叫泰隆4 小时前
Qt——3、常用控件
开发语言·qt·客户端
Queenie_Charlie5 小时前
小陶的疑惑2
数据结构·c++·树状数组
无小道5 小时前
Qt——QWidget
开发语言·qt
时艰.5 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
梵刹古音5 小时前
【C语言】 函数基础与定义
c语言·开发语言·算法
梵刹古音6 小时前
【C语言】 结构化编程与选择结构
c语言·开发语言·嵌入式
Yvonne爱编码6 小时前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
一方_self6 小时前
了解和使用python的click命令行cli工具
开发语言·python