本来想用一下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)。