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

相关推荐
h_a_o777oah2 小时前
【算法基础】卡特兰数:递推定义与折线对称公式推导及解题策略
c++·算法·acm·组合数学·卡特兰数·反射原理·动态规划dp
zlinear数据采集卡2 小时前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
帅气的小峰3 小时前
pybind11与nanobind可以共存吗?如何迁移?
c++·python·cuda·推理引擎
Dr.kangder3 小时前
嵌入式面试总结(二十一)——C语言关键字
c语言·开发语言·面试·职场和发展·架构·虚拟化
syker3 小时前
SuperNova Compiler v4.2.9 完整开发手册
c++
W_326003 小时前
Python-OpenCV:库、环境搭建、图片与摄像头解析
开发语言·图像处理·python·opencv·机器学习
zhy295633 小时前
在 QAIRT Genie SDK 上部署 Llama 3.2 1B 模型:从环境准备到 C++ 推理
开发语言·c++·llama
爱跳舞的烤冷面3 小时前
自学嵌入式第N天(Linux篇——文件编程)
java·开发语言·前端
richard_yuu3 小时前
JSON vs XML vs 二进制:3种序列化终极选型
xml·c++·qt·学习·json
caimouse4 小时前
ReactOS 图形系统分析(33):字体子系统 — font.c
c语言·开发语言·reactos