Qt使用链表

本来想用一下Qt链表类

QLinkedList Class

但是看文档的时候发现这句话

 官方都这样说了,那只能用std::list,说明如下,转自(https://blog.csdn.net/CV_Jason/article/details/83037127

 

List

  List使用一个doubly linked list(双向串列)管理元素,按惯例,C++标准库并未明定实现方式,只是遵守list的名称、限制和规格。List其实相当于数据结构中的双链表。
在这里插入图片描述

其中的list类型定义于namespace std 中,是一个class template:

template<
    class T,
    class Allocator = std::allocator<T>
> class list;

List的元素可以是任何类型T,Allocator用于指定内存模型,默认是C++ 标准库提供的类型。

 

List 的能力

  List的内部结构与vector和deque完全不同,List对象提供了两个pointer,分别指向前后元素。因此,List在几个方面与vector和deuqe不同:

  1.List不支持随机访问,因此访问元素的效率较低;

  2.任何位置上,执行元素的插入和移除都很快,始终是常量时间内完成,因为无需移动任何元素;

  3.安插和删除的操作不会因此指向其他元素的pointer、reference、iterator失效;

  4.List对异常的控制是,要么操作成功,要么什么都不发生。

 

List 操作

  List容器提供的一般STL所具备的通用能力,但相比于vector和deque具有如下不同——

  1.由于不支持随机访问,所以List没有at函数和下标操作符;

  2.List并未提供容量、空间重新分配等操作的函数,因为没有必要,每个元素有自己的内存,在元素被删除前一直有效;

  3.List提供不少特殊成员函数,专门用于移动和移除元素,较之同名的STL通用算法,这些函数执行起来更加迅速,因为他们只需要调整几个pointer即可。

 

构建、复制和销毁(Create、Copy and Destroy)

  List的构建、复制和销毁操作,与每一个序列式容器相同——

 

非更易型操作(Nonmodifying Operation)

  List也提供元素比较、查询大小等操作——

 

元素访问(Element Access)

   与vector和deque不同,list没有at和下标运算符,因此只有两个直接访问元素的函数。或者使用range-based for循环遍历所有元素——

 

赋值(Assignment)

  和其他序列式容器一样,list提供了通用的赋值动作——

 

迭代器函数(Iterator Function)

  运用迭代器访问list的唯一方法。由于list不支持随机访问,这些迭代器只是双向迭代器,因此所有用到随机迭代器的算法——特别是排序算法——都不能进行处理list,但好在list提供了sort函数来取而代之。

 

插入与移除(Inserting and Removing)

  list除了提供了通用的元素插入移除操作之外,还增加了适用于list的remove和remove_if算法。

  使用lambda语法使用remove_if算法,移除所有的偶数——

 

list特殊函数

  由于list存储结构的特性,list还提供了STL通用标准之外的特殊函数,这些函数将list的性能发挥得淋漓尽致,熟练使用这些操作将使编程工作变得事半功倍。

  下面是关于list排序函数的举例——

 

   sort按照op函数定义的规则进行从大到小的输出,下面是一个合并的举例——

 

异常处理 (Exception Handling)

  所有的STL容器中,list对异常的安全性提供了最佳支持,几乎有所的操作都是不成功便成仁:要么成功,要么无效。唯一不提供如此保证的是赋值运算和成员函数sort,不过他们也有最基本保证:抛出异常时不会泄漏资源,也不会与容器恒常特性(invariant)发生冲突。

  merge、remove、remove_if和unique提供的保证是有前提的,就是元素之间的比较动作不抛出异常。用数据库的术语来说,只要不调用赋值操作或sort,并保证元素互相比较时不抛出异常,那么list便可说是事物安全(transaction safe)。

posted @ 2021-05-13 19:07  补码  阅读(927)  评论(0编辑  收藏  举报