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的接口到这里就结束了。

相关推荐
z落落7 小时前
C#WinForm控件实战:Panel与单选框动态创建
开发语言·c#
ptc学习者7 小时前
python 中描述符@property property 大概的样子
开发语言·python
zmzb01037 小时前
Python课后习题训练记录Day129
开发语言·python
张忠琳7 小时前
【Go 1.26.4】Golang Map 深度解析
开发语言·后端·golang
Vertira7 小时前
如何对QT开发的软件进行打包[已解决]
开发语言·qt
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题 第110题】【并发篇】第10题:CAS 存在哪些问题?
java·开发语言·面试
石一峰6997 小时前
C 语言函数设计模式实战经验
c语言·开发语言·设计模式
sitellla8 小时前
Pydub:用 Python 处理音频,不写废话
开发语言·python·其他·音视频
xingyuzhisuan8 小时前
缓存命中率提升方案:从 30% 优化至 82% 全流程优化记录
java·开发语言·缓存·ai
郑洁文8 小时前
基于Python的恶意流量监测系统的设计与实现
开发语言·python