浅谈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);
这里需要注意:
-
如果删除的是值,会删除当前链表中所有的这个值。
-
如果删除的是位置上的元素,会导致这个迭代器从此失效,除非对其重新赋值,否则对其的所有操作都是错误的。这就像植物大战僵尸中的毁灭蘑菇,自己爆炸之后还会留下一个很久才会平的坑(我是颓多了么?)