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

相关推荐
橘颂TA19 小时前
【测试】高效浏览器操作:基础功能与优化设置大全
c++·功能测试·职场和发展·测试·web测试
一只小小的芙厨19 小时前
寒假集训笔记·以点为对象的树形DP
c++·算法
艾莉丝努力练剑19 小时前
hixl vs NCCL:昇腾生态通信库的独特优势分析
运维·c++·人工智能·cann
执风挽^19 小时前
Python基础编程题2
开发语言·python·算法·visual studio code
我在人间贩卖青春20 小时前
C++之new和delete
c++·delete·new
Z9fish20 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
Trouvaille ~20 小时前
TCP Socket编程实战(三):线程池优化与TCP编程最佳实践
linux·运维·服务器·网络·c++·网络协议·tcp/ip
June`20 小时前
高并发网络框架:Reactor模式深度解析
linux·服务器·c++
小镇敲码人20 小时前
剖析CANN框架中Samples仓库:从示例到实战的AI开发指南
c++·人工智能·python·华为·acl·cann
萧鼎20 小时前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv