QLinkedList理论总结
- 一、概述
- 二、使用说明
- 1. 声明链表
- 2. 获取元素、链表信息
- 3. 删除元素
- 4. 添加元素
- 5. 遍历元素
一、概述
QLinkedList是Qt的泛型容器类之一。它存储一个值列表,并提供基于迭代器的访问以及常量时间的插入和删除。
QList、QLinkedList和QVector提供类似的功能。
以下是概述:
对于大多数用途,QList是Qt官方推荐使用的的类。QList基于索引的API比QLinkedList的基于迭代器的API更方便,而且它通常比QVector更快,因为它在内存中存储项目的方式(详见算法复杂度)。而且QList还扩展到可执行文件中的代码更少。
如果你需要一个真正的链表,保证在链表中间的常量时间插入,并且迭代器指向项而不是索引,请使用QLinkedList。因为我们知道C语言里面的链表都是用指针来链接的的,没有索引。所以 QLinkedList 只能用迭代的方式来获取到。
如果需要每个元素在容器里面占用相邻的内存位置,请使用QVector。
二、使用说明
1. 声明链表
下面是一个存储整数的QLinkedList和存储QTime值的QLinkedList的例子:
QLinkedList<int> integerList;
QLinkedList<QTime> timeList;
QLinkedList存储一个项目列表。默认构造函数创建一个空列表。要向列表中插入项,可以使用操作符<<():
QLinkedList<QString> list;
list << "one" << "two" << "three";
// list: ["one", "two", "three"]
2. 获取元素、链表信息
如果想获取链表中的第一项或最后一项,用 first()和 last() 或者使用 front() 和 back()。
他们没啥区别,其实就是 front() 和 back() 只是 STL 函数的使用习惯的封装,和 first()和 last() 功能一样。
- contains(const T &value):判断链表里面有没有某个元素
- count(const T &value) const :获取某个元素的次数还有一个重载函数,直接获取链表元素个数
- size():获取元素列表大小
- startsWith(const T &value) :就是看是不是以某个元素开头
- isEmpty():判断是不是空链表
- toStdList() const:返回一个C++标准的列表-> std::list
3. 删除元素
如果想从列表的任何一端删除一个项,请使用removeFirst()或removeLast()。pop_back() 和 pop_front()也可以的。
如果想删除列表中所有给定值的出现,请使用removeAll()。
一个常见的需求是删除列表中的第一项或最后一项,并对其进行处理。为此,QLinkedList提供了takeFirst()和takeLast()。
下面是一个循环,每次从列表中删除一个项,并对它们调用delete:
QLinkedList<QWidget *> list;
...
while (!list.isEmpty())
delete list.takeFirst();
**QLinkedList的值类型必须是可赋值的数据类型。这涵盖了大多数常用的数据类型,但编译器不允许您将QWidget存储为值;相反,存储一个QWidget ***。一些函数有额外的要求;例如,contains()和removeAll()期望值类型支持operator==()。这些需求在每个功能的基础上被记录下来。
4. 添加元素
和QList的功能基本一致的。
- append(const T &value): 尾巴上添加元素
- prepend(const T &value):头前面添加元素
- push_back(const T &value):和 append 一样功能
- push_front(const T &value):和 prepend 一样功能
- += :重载运算,可以把两个链表合并在一起
5. 遍历元素
如果要在列表中间插入、修改或删除项,必须使用迭代器。QLinkedList提供了java风格的迭代器(QLinkedListIterator 和QMutableLinkedListIterator )和 STL 风格的迭代器(QLinkedList::const_iterator和QLinkedList::iterator)。有关详细信息,请参阅这些类的文档。STL 的其实就是C++基础语法就不说了
看看 java 这个风格的,所谓前向遍历从 头 head -> 尾巴 tail ,后向遍历其实就是 从 尾巴 tail -> 头 head
- QLinkedListIterator
简单来说就是只读的迭代器,不允许修改元素,主要用的就是 hasNext() 前向遍历,hasPrevious() 反向遍历
简单的前向遍历如下:
QLinkedList<float> list;
...
QLinkedListIterator<float> i(list);
while (i.hasNext())
qDebug() << i.next();
简单的后项向遍历如下:
QLinkedListIterator<float> i(list);
i.toBack();//把迭代器方向变成尾巴
while (i.hasPrevious())
qDebug() << i.previous();
- QMutableLinkedListIterator
简单来说就是可读可写的迭代器,一样支持前后迭代, hasNext() 前向遍历,hasPrevious() 反向遍历。
同时呢,用 remove() 删除节点,用 insert() 插入节点,用setValue()来修改节点值。
简单的前向遍历如下:
QLinkedList<float> list;
...
QMutableLinkedListIterator<float> i(list);
while (i.hasNext())
qDebug() << i.next();
简单的后项向遍历如下:
QMutableLinkedListIterator<float> i(list);
i.toBack();
while (i.hasPrevious())
qDebug() << i.previous();
简单的增删改
QMutableLinkedListIterator<int> i(list);
while (i.hasNext()) {
int val = i.next();
if (val < 0) {
i.setValue(-val);
} else if (val == 0) {
i.remove();
}
}