前言
在 C++ 标准模板库(STL)的众多容器中,list 以其独特的双向链表结构占据着重要地位。与 vector 的连续内存布局不同,list 通过节点间的指针连接实现元素存储,这使得它在插入、删除操作上具备无可替代的优势,但也带来了访问方式和迭代器特性上的差异。
本文将围绕 list 容器展开全方位解析,从最基础的构造方法讲起,深入剖析其迭代器的特性与分类,详细介绍各类常用接口的功能与使用注意事项,更会带你直击 list 的底层实现逻辑 —— 通过模拟实现来理解其节点设计、迭代器重载及核心成员函数的工作原理。
构造 list 的几种方法

list 的迭代器
begin+end rbegin+rend cbegin+cend(就是在原来 begin+end 基础上不让对迭代器进行修改了) crbegin+crend(就是在原来 rbegin+rend 基础上不让对迭代器进行修改了)
注意:list 这里迭代器: it = c.begin();//假设 c 是 list<int>类型的 while(it!=c.end()) {it++;} 这里不能写成 it<c.end();!因为不连续
引申:STL 中不同容器的迭代器
单向 (只能++): forward_list unordered_set/map
双向 (++或--):list map set
随机 (++或--或 +或-): vector/string/deque

可以从这里看出来,这个迭代器是双向迭代器
list 容器的其他接口
list 没有 [] 了,只能用迭代器去访问了 empty size 还在,但是没有 capacity front–返回第一个节点中 值的引用 back–返回 list 最后一个节点中 值的引用 push_front 在首元素前插入值为 val 的元素 pop_front 删除第一个元素 push_back 在尾部插入值为 val 的元素 pop_back 删除最后一个元素 insert(它的形参迭代器不会失效)erase(他的形参迭代器会失效,但是其返回值是下一个元素的迭代器) clear swap–交换两个 list 中的元素 sort reverse(reverse 一般习惯还是用算法库里面的,但是 list 不能用算法库里面的 sort–底层原因)
list 的 sort 接口
只在数据量小并且只排几次的情况下用 在数据量大并且频繁排序的情况下,
list 的 sort还没有把数据转移到 vector 去排序完再转回来的所用时间短 (release 下是这样的) 引申:所以处理数据要选择对的容器!
list 的模拟实现
list 是含头节点的双向循环链表 (头节点不存数据哈)
namespace renshen {
template<class T>
{
list_node<T>* _next;
list_node<T>* _prev;
T _val;
( T& val = ()):_next(),_prev(),_val(val){}
};
< , , >
{
list_node<T> Node;
__list_iterator<T, Ref, Ptr> iterator;
Node* _node;
__list_iterator(Node* node):_node(node){}
Ref *(){ _node->_val;}
Ptr ->(){&_node->_val;}
iterator&++(){ _node = _node->_next;*;}
iterator ++(){ ; _node = _node->_next; tmp;}
iterator&--(){ _node = _node->_prev;*;}
iterator --(){ ; _node = _node->_prev; tmp;}
booloperator!=( iterator& it){ _node != it._node;}
booloperator==( iterator& it){ _node == it._node;}
};
< >
{
list_node<T> Node;
:
__list_iterator<T, T&, T*> iterator;
__list_iterator<T, T&, T*> const_iterator;
{ _head->_next;}
{ _head;}
{ _head->_next;}
{ _head;}
(){ _head = Node; _head->_prev = _head; _head->_next = _head; _size =;}
(){();}
( list<T>& lt)
{
();
(& e : lt){(e);}
}
(list<T>& lt){ std::(_head, lt._head); std::(_size, lt._size);}
list<T>&=(list<T> lt)
{
(lt);
*;
}
~(){(); _head; _head =;}
(){ iterator it =();(it !=()){ it =(it);} _size =;}
( T& x){((), x);}
( T& x){((), x);}
(){(--());}
(){(());}
{
Node* cur = pos._node;
Node* prev = cur->_prev;
Node* newnode =(x);
prev->_next = newnode;
newnode->_next = cur;
cur->_prev = newnode;
newnode->_prev = prev;
++_size;
newnode;
}
{
(pos !=());
Node* cur = pos._node;
Node* prev = cur->_prev;
Node* next = cur->_next;
prev->_next = next;
next->_prev = prev;
cur;
--_size;
next;
}
{ _size;}
:
Node* _head;
_size;
};
}


