目录
1.容器类概述
-
Qt提供了多个基于模板的容器类,这些容器类可以用于存储指定类型的数据项。
-
Qt的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的,而且它们进行了速度和存储优化,因此可以减少可执行文件的大小。此外,它们还是线程安全的,也就是说它们作为只读容器时可被多个线程访问。
-
Qt的容器类分为顺序容器(sequentialcontainers)和关联容器(associativecontainers)。
-
容器迭代类用于遍历容器里的数据项,有Java类型的迭代类和STL类型的迭代类。Java类型的迭代类易于使用,提供高级功能,而STL类型的迭代类效率更高一些。Qt还提供了foreach宏用于遍历容器内的所有数据项。
2.顺序容器类
2.1 QList
//基本数据类型QList<int> integerList;QList<QDate> dateList;//存储QObject对象的地址QList <QWidget *> ptr_widgets;QList <QObject *> ptr_objects;
QList<QString> list = { "one", "two", "three" };QWidget * widget1 = new QWidget();QWidget * widget2 = new QWidget();QList<QWidget *> ptr_widgets = {widget1, widget2};
1. 增加节点insert():插入节点到append():尾部添加节点prepend() :头部添加节点operator <<():尾部添加节点或链表operator+=():尾部添加节点2. 删除节点removeAt():删除节点removeFirst():删除头节点removeLast():删除尾节点3. 移动节点move():链表内移动节点位置swap():俩个链表交换值(其实交换一下地址映射就能实现)4. 修改节点值replace():替换链表内的节点值
QList是有序的链表,可以通过索引来得到。1. operator [ ] 数组索引符:这个和普通数组一样的使用 [ ] 访问下标方法一致2. at() 函数:也是通过索引值,也即是下标方式Qt 推荐使用at()函数,这样的效率更好,因为 at()函数不会发生 深拷贝 ,而另外一种方式会。QList还提供了一些快捷的 索引 + 返回索引节点 + 删除原索引节点,也就是组合的功能;但是这个是 take…不是get…这样的,这就意味着,这个其实是剪掉一个节点,并返回。3. takeAt():取得在指定位置的节点4. takeFirst():取得头节点 ;等价【takeAt(0)】5. takeLast():取得尾节点
contains():是否包含节点xxxcount():对指定节点值计数isEmpty():链表为空size():链表大小indexOf():节点位置
2.2 QLinkedList
QLinkedList<T>是链式列表(linked-list)(双向链表容器类),数据项不是用连续的内存存储的,它基于迭代器访问数据项,并且插入和删除数据项的操作时间相同。除了不提供基于下标索引的数据项访问外,QLinkedList的其他接口函数与QList基本相同。
(1)重要特性如下:
-
动态大小:QLinkedList 的大小是动态的,可以根据需要轻松添加或删除元素。这使得它在处理具有不确定大小的数据集时非常有用。
-
双向遍历:与 QVector 和 QList 不同,QLinkedList 允许从头到尾以及从尾到头的双向遍历。这种遍历方式在某些场景下会非常有用。
-
高效的插入和删除操作:在链表的中间插入或删除元素的时间复杂度为 O(1)。这使得 QLinkedList 在需要频繁插入和删除元素的场景中,具有优势。
-
不需要连续内存:与 QVector 和 QList 相比,QLinkedList 的元素不需要存储在连续的内存空间中。这意味着在内存碎片化的情况下,QLinkedList 可能更容易分配内存。
(2)常用接口
构造函数和析构函数:
-
QLinkedList(): 创建一个空的 QLinkedList。
-
QLinkedList(const QLinkedList<T> &other): 复制构造函数,用另一个 QLinkedList 对象来创建一个新的对象。
-
~QLinkedList(): 析构函数,用于释放资源。
容量相关接口:
-
bool isEmpty() const: 返回链表是否为空。
-
int size() const: 返回链表中元素的数量。
元素访问接口:
-
T &first(): 返回链表中第一个元素的引用。
-
const T &first() const: 返回链表中第一个元素的常量引用。
-
T &last(): 返回链表中最后一个元素的引用。
-
const T &last() const: 返回链表中最后一个元素的常量引用。
修改接口:
-
void append(const T &value): 在链表末尾添加一个元素。
-
void prepend(const T &value): 在链表开头添加一个元素。
-
void insert(int i, const T &value): 在链表的指定位置插入一个元素。
-
void removeFirst(): 移除链表中的第一个元素。
-
void removeLast(): 移除链表中的最后一个元素。
-
bool removeOne(const T &value): 移除链表中第一个与指定值相等的元素,如果成功移除则返回 true,否则返回 false。
-
int removeAll(const T &value): 移除链表中所有与指定值相等的元素,返回移除的元素个数。
-
void clear(): 清空链表。
查找接口:
-
bool contains(const T &value) const: 检查链表是否包含指定值的元素。
-
int count(const T &value) const: 返回链表中指定值的元素个数。
-
int indexOf(const T &value, int from = 0) const: 返回链表中指定值的第一个元素的索引,如果未找到则返回 -1。
-
int lastIndexOf(const T &value, int from = -1) const: 返回链表中指定值的最后一个元素的索引,如果未找到则返回 -1。
迭代器:
-
iterator begin(): 返回指向链表第一个元素的迭代器。
-
const_iterator begin() const: 返回指向链表第一个元素的常量迭代器。
-
iterator end(): 返回指向链表末尾的迭代器。
-
const_iterator end() const 返回指向链表末尾的常量迭代器。
-
const_iterator cbegin() const: 返回指向链表第一个元素的常量迭代器。
-
const_iterator cend() const: 返回指向链表末尾的常量迭代器。
-
reverse_iterator rbegin(): 返回指向链表最后一个元素的反向迭代器。
-
const_reverse_iterator rbegin() const: 返回指向链表最后一个元素的常量反向迭代器。
-
reverse_iterator rend(): 返回指向链表起始位置之前的反向迭代器。
-
const_reverse_iterator rend() const: 返回指向链表起始位置之前的常量反向迭代器。
-
const_reverse_iterator crbegin() const: 返回指向链表最后一个元素的常量反向迭代器。
-
const_reverse_iterator crend() const: 返回指向链表起始位置之前的常量反向迭代器。
比较操作ÿ