C++ std::list 完全指南:从入门到精通所有接口

一、list的接口


list是一个带头的双向循环链表,支持在任意位置的插入和删除操作

1. 构造函数

cpp 复制代码
//无参的构造
list();
//n个val去构造
explicit list (size_type n, const value_type& val = value_type(),const allocator_type& alloc = allocator_type());
//用一段迭代器区间去构造
template <class InputIterator>
list (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type());
//拷贝构造
list (const list& x);
//初始化列表去构造
list (initializer_list<value_type> il,const allocator_type& alloc = allocator_type());

2. 赋值重载

cpp 复制代码
//用另一个list对象赋值给一个list对象
list& operator= (const list& x);
//用初始化列表赋值给list对象
list& operator= (initializer_list<value_type> il);

3. 迭代器

cpp 复制代码
iterator begin() noexcept;
const_iterator begin() const noexcept;
iterator end() noexcept;
const_iterator end() const noexcept;
//反向迭代器
reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;
reverse_iterator rend() nothrow;
const_reverse_iterator rend() const nothrow;

4. 容量

cpp 复制代码
//判空
bool empty() const noexcept;
//容器元素的个数
size_type size() const noexcept;

5. 访问元素

cpp 复制代码
//返回容器中第一个元素的引用
reference front();
const_reference front() const;
//返回容器中最后一个元素的引用
reference back();
const_reference back() const;

6. 修改

cpp 复制代码
//用一段迭代器赋值
template <class InputIterator>
void assign (InputIterator first, InputIterator last);
//用n个val赋值
void assign (size_type n, const value_type& val);
//用初始化列表赋值
void assign (initializer_list<value_type> il);
//头插
void push_front (const value_type& val);
//头删
void pop_front();
//尾插
void push_back (const value_type& val);
//尾删
void pop_back();
//在pos位置插入单个元素
iterator insert (const_iterator position, const value_type& val);
//在pos位置插入n个val
iterator insert (const_iterator position, size_type n, const value_type& val);
//在pos位置插入一段迭代器区间
template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);
//在pos位置插入一个初始化列表
iterator insert (const_iterator position, initializer_list<value_type> il);
//删除pos位置的元素
iterator erase (const_iterator position);
//删除一段迭代器区间
iterator erase (const_iterator first, const_iterator last);
//交换两个list对象的内容
void swap (list& x);
// n < size,保留前n个元素
//n > size,插入元素到n个,如果val是具体的,就用val的拷贝去初始化,否则,将被值初始化
void resize (size_type n);
void resize (size_type n, const value_type& val);
//清空list中所有的元素
void clear() noexcept






7. 操作

cpp 复制代码
//在pos位置插入一个list对象
void splice (const_iterator position, list& x);
//只转移x对象中i位置的元素到另一个list对象中
void splice (const_iterator position, list& x, const_iterator i);
void splice (const_iterator position, list&& x, const_iterator i);
//转移x中的一段迭代器区间到另一个list对象中
void splice (const_iterator position, list& x,const_iterator first, const_iterator last);
void splice (const_iterator position, list&& x,const_iterator first, const_iterator last);
//删除容器中所有和val值相等的元素
void remove (const value_type& val);
//去重,原理双指针(只能去除相邻的重复的元素,常与sort搭配使用)
void unique();
//合并链表,原理归并排序(要求两个list对象都是有序的)
void merge (list& x);
//comp仿函数对象,控制比较大小的逻辑
template <class Compare>
void merge (list& x, Compare comp);
//链表排序
void sort();
template <class Compare>
void sort (Compare comp);
//逆置链表
void reverse() noexcept;


8. 非成员函数

cpp 复制代码
//友元函数
(1)template <class T, class Alloc>
bool operator== (const list<T,Alloc>& lhs, const list<T,Alloc>& rhs);
(2)template <class T, class Alloc>
bool operator!= (const list<T,Alloc>& lhs, const list<T,Alloc>& rhs);
(3)template <class T, class Alloc>
bool operator<  (const list<T,Alloc>& lhs, const list<T,Alloc>& rhs);
(4)template <class T, class Alloc>
bool operator<= (const list<T,Alloc>& lhs, const list<T,Alloc>& rhs);
(5)template <class T, class Alloc>
bool operator>  (const list<T,Alloc>& lhs, const list<T,Alloc>& rhs);
(6)template <class T, class Alloc>
bool operator>= (const list<T,Alloc>& lhs, const list<T,Alloc>& rhs);
//交换两个list对象的内容
template <class T, class Alloc>
void swap (list<T,Alloc>& x, list<T,Alloc>& y);

list的接口到这里就结束了。

相关推荐
_olone5 分钟前
Luogu P2704 [NOI2001] 炮兵阵地
c++·算法·状压dp
c2385620 分钟前
互斥锁高频面试题全解:从基础概念到底层实现,一文通关
java·c++·面试·职场和发展
北冥you鱼29 分钟前
Go 语言读取链上数据:从基础到实战
开发语言·后端·golang
nianniannnn31 分钟前
c++复习自存--继承
开发语言·c++
叩码以求索2 小时前
经典算法实例分析:写字符串需要的行数
开发语言·javascript·ecmascript
我是唐青枫2 小时前
Kotlin 运算符重载详解:为什么 a += b 有时改对象,有时换对象?
开发语言·kotlin
2zcode2 小时前
基于MATLAB图像处理的饮料瓶识别与价格显示系统设计与实现
开发语言·图像处理·matlab
王老师青少年编程2 小时前
2026年6月GESP真题及题解(C++二级):完全平方数计数
c++·题解·真题·gesp·二级·2026年6月·完全平方数计数
zwenqiyu2 小时前
非线性字符串数据结构串讲
数据结构·c++·学习·算法
骑士雄师2 小时前
大模型:临时会话
开发语言·python