Qt扫盲-QLinkedList理论总结

一、概述

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();
      }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳风暴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值