浅谈C++ STL list 容器

浅谈C++ STL list 容器

本篇随笔简单讲解一下(C++STL)(list)容器的使用方法和使用技巧。

list容器的概念

学习过(C++STL)的很多同学都知道,(STL)(标准模板库)中的容器其实都是我们在算法竞赛中常用数据结构的一些模板。比如说(queue)模拟的队列,(priority\_queue)模拟的堆等等。那么,我们可以把(list)理解为模拟数据结构中“双向链表”的模板。

关于双向链表的基本概念以及手动模拟实现,如有不懂的同学可以看这里:

详解数据结构—链表

简单来讲,链表就是数组的一个优化结构,它支持在任意两个元素中插入,也支持删除任意元素后把被删除元素的前后两个元素拼接在一起。

list容器的声明

(list)容器的声明和大部分(STL)容器的声明方式一样,都是:容器名<变量类型> 名称的结构。值得一提的是,(list)容器需要开#include<list>模板库。

#include<list>
list<int> l;
list<char> l;
list<pair<int,int> > l;
list<node> l;
struct node{...};

list容器的使用

与其他STL容器相似的用法

用法 作用
l.begin(),l.end() 返回list的首、尾迭代器
l.front(),l.back() 返回list的首、尾元素
l.push_back() 在链表后插入一个元素
l.push_front() 在链表前插入一个元素
l.pop_back() 在链表后删除一个元素
l.pop_front() 在链表前删除一个元素
l.clear() 清空链表
l.size() 返回链表中元素的个数
l.empty() 判断链表是否为空

插入操作

因为(list)支持在任意位置插入和删除,所以如果只能使用(push\_front())(pop\_front())这种类型的成员函数未免就让它失去了链表的名头。

(list)中,我们使用(insert())函数来支持在任意位置加入元素。原理很简单,上传两个参数,一个是位置参数,一个是值的参数。注意,这里上传的位置参数需要时一个迭代器。这样,插入之后,这个插入元素会在迭代器指向元素的前一位

类似:

l.insert(it,val);

删除操作

删除操作有两种:一种是删除指定元素,一种是删除指定位置。这两种删除操作贴心地规划了用户在实际编写时可能遇到的问题。

其实也很简单啊。

如果删除的是某位置的元素,直接传这个位置的迭代器。

remove(it);

如果删除的是某个值,就直接传这个值:

remove(val);

这里需要注意:

  • 如果删除的是值,会删除当前链表中所有的这个值。

  • 如果删除的是位置上的元素,会导致这个迭代器从此失效,除非对其重新赋值,否则对其的所有操作都是错误的。这就像植物大战僵尸中的毁灭蘑菇,自己爆炸之后还会留下一个很久才会平的坑(我是颓多了么?)

原文地址:https://www.cnblogs.com/fusiwei/p/11835081.html