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

相关推荐
白晨并不是很能熬夜11 小时前
【PRC】第 2 篇:Netty 通信层 — NIO 模型 + 自定义协议 + 心跳
java·开发语言·后端·面试·rpc·php·nio
简简单单就是我_hehe11 小时前
后端链路追踪局部采集和全量采集配置说明
java·开发语言
北京理工大学软件工程11 小时前
C#111
开发语言·c#
叶子野格12 小时前
《C语言学习:指针》12
c语言·开发语言·c++·学习·visual studio
光影少年12 小时前
前端线上屏幕出现卡顿如何排查?
开发语言·前端·javascript·学习·前端框架·node.js
ch3nyuyu12 小时前
静态库和动态库的制作
linux·运维·开发语言
a11177612 小时前
高斯泼溅 (Gaussian Splatting) 的 Three.js 实现
开发语言·javascript·ecmascript
成都渲染101云渲染666613 小时前
云渲染全面支持3dsMax 2027,高效渲染体验升级
开发语言·前端·javascript
Fuyo_111913 小时前
C++ 内存管理
c++·笔记
向往着的青绿色13 小时前
Java反序列化漏洞(持续更新中)
java·开发语言·计算机网络·安全·web安全·网络安全·网络攻击模型