人小鬼不大

导航

 

一、list容器简介

  list是顺序容器的一种。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表。双向链表的每个元素中都有一个指针指向后一个元素,也有一个指针指向前一个元素。list 容器不支持根据下标随机存取元素。搜索的速度很慢,可以在任何位置快速插入或者移除元素。

  list容器的实现:list的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。前驱元素指针域保存了前驱元素的首地址;数据域则是本节点的数据;后继元素指针域则保存了后继元素的首地址。由于list元素节点并不要求在一段连续的内存中,所以在list中是不支持快速随机存取的,因此对于迭代器,只能通过“++”或“--”操作将迭代器移动到后继/前驱节点元素处。而不能对迭代器进行+n或-n的操作。

  头文件:#include <list>

  使用STL中的算法头文件:#include <algorithm>

二、list中常用的函数

1、构造函数 

  list() 声明一个空列表;

  list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的

  list(n,val) 声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的

  list(n,val) 声明一个和上面一样的列表

  list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素

2、begin()和end()

  通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator,可以调用list容器的 end() 函数来得到list末端下一位置,相当于:int a[n]中的第n+1个位置a[n],实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用。

3、push_back() 和push_front()

  使用list的成员函数push_back和push_front插入一个元素到list中。其中push_back()从list的末端插入,而 push_front()实现的从list的头部插入。

4、empty()和clear()

  empty() 判断list是否为空。

  clear()清空list中的所有元素。

5、 resize()

   如果调用resize(n)将list的长度改为只容纳n个元素,超出的元素将被删除,如果需要扩展那么调用默认构造函数T()将元素加到list末端。如果调用resize(n,val),则扩展元素要调用构造函数T(val)函数进行元素构造,其余部分相同。

6、front()和back()

   通过front()可以获得list容器中的头部元素,通过back()可以获得list容器的最后一个元素。但是有一点要注意,就是list中元素是空的时候,这时候调用front()和back()会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,那我们编程序时就要注意了,个人觉得在使用之前最好先调用empty()函数判断list是否为空。

7、pop_back和pop_front()

  通过删除最后一个元素,通过pop_front()删除第一个元素;序列必须不为空,如果当list为空的时候调用pop_back()和pop_front()会使程序崩掉。

8、  assign()

  具体和vector中的操作类似,也是有两种情况,第一种是:l1.assign(n,val)将 l1中元素变为n个T(val)。第二种情况是:l1.assign(l2.begin(),l2.end())将l2中的从l2.begin()到l2.end()之间的数值赋值给l1。

9、 swap()

  交换两个链表(两个重载),一个是l1.swap(l2); 另外一个是swap(l1,l2),都可能完成连个链表的交换。

10、 reverse()

  通过reverse()完成list的逆置。

11、 merge()

  合并两个链表并使之默认升序(也可改),l1.merge(l2,greater<int>()); 调用结束后l2变为空,l1中元素包含原来l1 和 l2中的元素,并且排好序,升序。其实默认是升序,greater<int>()可以省略,另外greater<int>()是可以变的,也可以不按升序排列。

12、insert()

在指定位置插入一个或多个元素(三个重载):

  l1.insert(l1.begin(),100); 在l1的开始位置插入100。

  l1.insert(l1.begin(),2,200); 在l1的开始位置插入2个100。

  l1.insert(l1.begin(),l2.begin(),l2.end());在l1的开始位置插入l2的从开始到结束的所有位置的元素。

13、erase()

删除一个元素或一个区域的元素(两个重载)

  l1.erase(l1.begin()); 将l1的第一个元素删除。

  l1.erase(l1.begin(),l1.end()); 将l1的从begin()到end()之间的元素删除。

14、sort()

  将链表从小到大排序

15、remove (const T & val)

  删除和 val 相等的元素

16、remove_if

  删除符合某种条件的元素

17、unique()

  删除所有和前一个元素相等的元素

18、splice(iterator i, list <T> & x, iterator first, iterator last)

  在位置 i 前面插入链表 x 中的区间 [first, last),并在链表 x 中删除该区间。链表自身和链表 x 可以是同一个链表,只要 i 不在 [first, last) 中即可

  unique、merge、splice 成员函数等都不止一个,是重载的。STL 中的算法 sort 可以用来对 vector 和 deque 排序,它需要随机访问迭代器的支持。因为 list 不支持随机访问迭代器,所以不能用算法 sort 对 list 容器排序。因此,list 容器引入了 sort 成员函数以完成排序。

posted on 2019-12-29 15:38  人小鬼不大  阅读(566)  评论(0)    收藏  举报