【STL】容器 > 顺序容器 > list(双向链表)

本文详细介绍了C++标准模板库中的list容器,一种双向链表结构。探讨了list的内部实现原理,包括底层存储机制,并提供了如何使用list的实例,如插入、删除等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL中的list就是一双向链表,可高效地进行插入删除元素。STL提供的list是一个双向链表容器,对应的迭代器类型为Bidirectional Iterators. 对于双向链表我们可以方便的在任意位置进行插入和删除操作,list每个节点的内存位置之间没有必然联系。List 是C++标准程式库中的一个类,可以简单视之为双向连结串行,以线性列的方式管理物件集合。list 的特色是在集合的任何位置增加或删除元素都很快,但是不支持随机存取。list 是C++标准程式库提供的众多容器(container)之一,除此之外还有vector、set、map、…等等。list 以模板方式实现(即泛型),可以处理任意型别的变量,包括使用者自定义的资料型态,例如:它可以是一个放置整数(int)型态的 list、也可以是放置字串(char 或 string)型态的 list、或者放置使用者自定类别(user-defined class)的 list。
list 被定义在 <list> 标头档中。一如其他STL元件,list属于std名称空间。

list 内部以数据结构的双向连结串行实做,内部元素并非放置于连续大块内存中,而是散落于内存各处,互相以link串接起来,每个元素都只知道其前一个元素以及下一个元素的位置。故要走访整个list,必须从第一个元素开始逐个往下寻访,不支持随机存取(Random Access)。 list 的强项是高效的插入以及删除,于list插入或删除时只需要改动元素的link字段,不需要搬动元素,代价相对便宜。

list 在经常需要于集合内部任意位置(即除了头尾以外的其他位置) 频繁增删元素的工作上表现优秀。若仅需要于集合尾端增删元素,那应该优先考虑vector容器,若仅于头尾二端增删元素,那应该优先考虑deque容器。

一、内部实现

1.1 底层存储机制

以结点为单位存放数据,结点的地址在内存中不一定连续,每次插入或删除一个元素,就配置或释放一个元素空间。

二、使用list

成员函数概观
Iterators:
list.begin() 回传指向第一个元素的 Iterator。
list.end() 回传指向最末元素的下一个位置的 Iterator。
list.rbegin() 回传指向最末个元素的反向 Iterator。
list.rend() 回传指向第一个元素的前一个位置的反向 Iterator。
Capacity/Size:
list.empty() 若list内部为空,则回传true值。
list.size() 回传list内实际的元素个数。
lsit.resize() 重新分派list的长度。
Element Access
list.front() 存取第一个元素。
list.back() 存取最末个元素。
Modify methods
list.push_front() 增加一个新的元素在 list 的前端。
list.pop_front() 删除 list 的第一个元素。
list.push_back() 增加一个新的元素在 list 的尾端。
list.pop_back() 删除 list 的最末个元素。


构造:
list<int> c0; //空链表
list<int> c1(3); //建一个含三个默认值是0的元素的链表
list<int> c2(5,2); //建一个含五个元素的链表,值都是2
list<int> c4(c2); //建一个c2的copy链表
list<int> c5(c1.begin(),c1.end()); c5含c1一个区域的元素[First, Last)。
方法:
assign() //分配值,有两个重载:
c1.assign(c2.begin(), c2.end())
c1.assign(7,4) //c1中现在为7个4,c1(4,4,4,4,4,4,4)。
back() //返回最后一元素的引用:
begin() //返回第一个元素的指针(iterator)
clear() //删除所有元素
empty() //判断是否链表为空
end() //返回最后一个元素的下一位置的指针(list为空时end()=begin())
erase() //删除一个元素或一个区域的元素(两个重载)
front() //返回第一个元素的引用:
insert() //在指定位置插入一个或多个元素(三个重载):
max_size() //返回链表最大可能长度(size_type就是int型):
merge() //合并两个链表并使之默认升序(也可改):
pop_back() //删除链表尾的一个元素
pop_front() //删除链表头的一元素
push_back() //增加一元素到链表尾
push_front() //增加一元素到链表头
rbegin() //返回链表最后一元素的后向指针(reverse_iterator or const)
rend() //返回链表第一元素的下一位置的后向指针
remove //()删除链表中匹配值的元素(匹配元素全部删除)
remove_if() //删除条件满足的元素(会遍历一遍链表)
resize() //重新定义链表长度(两重载):
reverse() //反转链表:
size() //返回链表中元素个数
sort() //对链表排序,默认升序(可自定义)
splice() //对两个链表进行结合(三个重载)
swap() //交换两个链表(两个重载)
unique() //删除相邻重复元素(断言已经排序,因为它不会删除不相邻的相同元素)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值