当前位置: 首页 > news >正文

c++-list

C++-list

std::list是C++标准模板库(STL)提供的双向链表容器,它提供了高效的插入和删除操作,特别适合频繁修改的序列。定义在 <list> 头文件中,属于 std 命名空间。该类的接口与常规容器接口基本一致。

模板原型:

template < class T, class Alloc = allocator<T> > class list;

allocator<T>:STL空间配置器(内存池)。

基本特性:

  • 实现方式:双向链表结构,每个元素包含指向前驱和后继的指针。

  • 内存分配:元素在内存中非连续存储的,通过指针链接。

  • 泛型容器:通过模板实现,可以存储任何类型的元素。

  • 迭代器:双向迭代器(支持++和–操作)。

1. 底层理解

list 底层是 带头双向循环链表

template<typename T>
struct list_node{T val;list_node* prev;list_node* next;list_node(const T& data = T()) :val(data) , prev(nullptr) , next(nullptr) {}
};
template<typename T>
class list {private:list_node<T>* node;
}

在这里插入图片描述


2. 成员函数

2.1 成员类型

成员类型解释
value_type第一个模板参数(T)
allocator_type第二个模板参数(Alloc)
size_type无符号整数(size_t)
reference类型引用(T&)
const_referenceconst类型引用(const T&)

2.2 构造函数

序号函数原型说明
1️⃣explicit list (const allocator_type& alloc = allocator_type())默认构造
2️⃣list (const list& x)拷贝构造
3️⃣explicit list (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type())使用 n 个 val 值初始化
4️⃣template <class InputIterator> list (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())使用一段迭代器区间初始化

2.3 赋值重载

序号函数原型说明
1️⃣list& operator= (const list& x)两个已存在的 list 对象的赋值

2.4 迭代器

序号函数原型说明
1️⃣iterator begin()返回指向 list 对象中第一个元素的迭代器
2️⃣const_iterator begin() const返回指向 list 对象中第一个元素的 const迭代器
3️⃣iterator end()返回指向 list 对象末尾元素之后位置的迭代器
4️⃣const_iterator end() const返回指向 list 对象末尾元素之后位置的 const迭代器
5️⃣reverse_iterator rbegin()返回指向 list 对象末尾元素的反向迭代器
6️⃣const_reverse_iterator rbegin() const返回指向 list 对象末尾元素的const反向迭代器
7️⃣reverse_iterator() rend()返回指向 list 对象起始元素之前位置的反向迭代器
8️⃣const_reverse_iterator() rend() const返回指向 list 对象起始元素之前位置的const反向迭代器

在这里插入图片描述


2.5 容量相关的接口

序号函数原型说明
1️⃣size_type size() const返回 list 对象中元素的数量
2️⃣bool empty() const判断当前 list 对象是否为空

2.6 元素的访问

序号函数原型说明
1️⃣reference front()返回 list 对象第一个元素的引用
2️⃣const_reference front() const返回 const list 对象第一个元素的 const引用
3️⃣reference back()返回 list 对象最后一个元素的引用
4️⃣const_reference back() const返回 const list 对象最后一个元素的引用

2.7 修改相关的接口

序号函数原型说明
1️⃣template <class InputIterator> void assign (InputIterator first, InputIterator last)使用一段迭代器区间赋值给 list 对象(通常使用其他容器)
2️⃣void push_front (const value_type& val)在 list 对象头部插入 val 元素
3️⃣void pop_front()在 list 对象头部删除一个元素
4️⃣void push_back (const value_type& val)在 list 对象尾部插入 val 元素
5️⃣void pop_back()在 list 对象尾部删除一个元素
6️⃣iterator insert (iterator pos, const value_type& val);在 list 对象的 pos 位置迭代器插入 val 元素,返回新插入元素的迭代器
7️⃣iterator erase (iterator pos);删除 list 对象的 pos 位置迭代器元素,返回删除位置元素的下一个迭代器
8️⃣void clear();清空 list 对象中所有元素

2.8 其他操作

序号函数原型说明
1️⃣void reverse()逆置 list 对象中的元素
2️⃣void sort()排序 list 对象中的元素(默认升序)
3️⃣void merge (list& x)合并两个有序的 list,将 x 对象中的所有元素合并到当前 list 中,合并完后 x 将变为空链表
4️⃣void unique()去重,但前提需要 list 对象有序
5️⃣void remove (const value_type& val)移除所有 val 元素
6️⃣void splice (iterator position, list& x)将x链表中的所有元素移动到当前链表的 position迭代器之前,移动后 x 变为空链表
7️⃣void splice (iterator position, list& x, iterator i)将x链表中 i 位置迭代器元素移动到当前链表的 position迭代器之前
8️⃣void splice (iterator position, list& x, iterator first, iterator last);将x链表一段迭代器区间移动到当前链表的 position迭代器之前
  1. reverse

在这里插入图片描述


  1. sort

在这里插入图片描述


  1. merge

在这里插入图片描述

  1. unique

在这里插入图片描述


  1. remove

在这里插入图片描述


6.splice

在这里插入图片描述

3. list迭代器失效

C++中,list 与 vector 迭代器失效有所不同,list迭代器失效主要发生在 元素被删除时

迭代器失效的情况:

  • erase 时被删除位置元素迭代器失效

    • 解决方式:通过 erase 返回值重新获取迭代器(erase返回删除元素的下一个位置迭代器
  • 整个 list 被销毁或赋值时,所有迭代器都会失效。

4. list模拟实现

// list.hpp
#pragma once#include <iostream>
#include <cassert>namespace simulate_list {template<typename T>struct list_node{T val;list_node* prev;list_node* next;list_node(const T& data = T()) :val(data) , prev(nullptr) , next(nullptr) {}};template<typename T , typename Ref , typename Ptr>struct __list_iterator {typedef list_node<T> node;typedef __list_iterator<T , Ref , Ptr> self;__list_iterator(node* nodeptr) :cur(nodeptr) {}self& operator++() {cur = cur->next;return *this;}self operator++(int) {self temp(cur);cur = cur->next;return temp;}self& operator--() {cur = cur->prev;return *this;}self operator--(int) {self temp(cur);cur = cur->prev;return temp;}Ref operator*() {return cur->val;}Ptr operator->() {return &(operator*());}bool operator==(const self& s) {return cur == s.cur;}bool operator!=(const self& s) {return cur != s.cur;}node* cur;};template<typename T>class list {typedef list_node<T> node;public:typedef __list_iterator<T , T& , T*> iterator;typedef __list_iterator<T , const T& , const T*> const_iterator;iterator begin() { return iterator(head->next); }iterator end() { return iterator(head); }const_iterator begin() const { return const_iterator(head->next); }const_iterator end() const { return const_iterator(head); }bool empty() const { return head->next == head; }T& front() { assert(!empty()); return head->next->val; }T& back() { assert(!empty()); return head->prev->val; }const T& front() const { assert(!empty()); return head->next->val; }const T& back() const { assert(!empty()); return head->prev->val; }size_t size() const {size_t count = 0;for (auto& a : *this) count++;return count; }void clear() {auto it = begin();while (it != end())it = erase(it);}void initializer_list() {head = new node;head->prev = head;head->next = head;}list<T>() {initializer_list();}list<T>(const list<T>& l) {initializer_list();for (auto& node : l)push_back(node);}list<T>& operator=(list<T> l) {std::swap(head , l.head);return *this;}~list<T>() {clear();delete head;head = nullptr;}iterator insert(iterator position , const T& val);iterator erase(iterator position);void push_front(const T& val) { insert(begin() , val); }void pop_front() { assert(!empty()); erase(begin()); }void push_back(const T& val) { insert(end() , val); }void pop_back() { assert(!empty()); erase(--end()); }  private:node* head = nullptr;}; template<typename T>typename list<T>::iterator list<T>::insert(list<T>::iterator position , const T& val) {node* prev = position.cur->prev;node* newnode = new node(val);prev->next = newnode;newnode->prev = prev;newnode->next = position.cur;position.cur->prev = newnode;return iterator(newnode);   // 返回新插入节点的迭代器}template<typename T>typename list<T>::iterator list<T>::erase(list<T>::iterator position) {node* prev = position.cur->prev;node* next = position.cur->next;prev->next = next;next->prev = prev;delete position.cur;return iterator(next);  // 返回删除元素的下一个元素}} // namespace simulate_list end
http://www.dtcms.com/a/304318.html

相关文章:

  • Python 程序设计讲义(29):字符串的处理方法——大小写转换
  • 【C++算法】83.BFS解决最短路径问题_最短路径问题简介
  • Redis学习07-Redis的过期策略
  • (1-7-5) Mysql 对 数据的基本操作
  • MC0241防火墙
  • Object.freeze() 深度解析:不可变性的实现与实战指南
  • 道路坑洞检测数据集介绍8300张图片-智能道路巡检系统 车载安全监测设备 城市基础设施管理
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博文章数据可视化分析-文章评论量分析实现
  • 从零到一:Django图书管理系统完整开发实战指南
  • 开源数据库PostgreSQL专家技术
  • 从视觉到现实:掌握计算机视觉技术学习路线的十大步骤
  • 在 PolkaVM 上用 Rust 实现 ERC20 合约的全流程开发指南
  • 三维扫描相机:工业自动化的智慧之眼——迁移科技赋能智能制造新纪元
  • Element Plus常见基础组件(一)
  • 白玩 一 记录retrofit+okhttp+flow 及 kts的全局配置
  • Javaweb - 13 - AJAX
  • 《P5960 【模板】差分约束》
  • LeetCode Hot 100:11. 盛最多水的容器
  • Vulnhub 02-Breakout靶机渗透攻略详解
  • 牛顿拉夫逊法PQ分解法计算潮流MATLAB程序计算模型。
  • 【AI论文】Yume:一种交互式世界生成模型
  • Docker网络技术深度研究与实战手册
  • C++与C#实战:FFmpeg屏幕录制开发指南
  • 2025年KBS顶刊新算法-向光优化算法Phototropic growth algorithm-附Matlab免费代码
  • 从线下挂号到全流程智能问诊:智慧医院APP源码开发指南
  • MATLAB弹塑性固体有限元计算程序
  • 【LGR-234-Div.3】洛谷网校 7 月 CSP-J 模拟月赛 Cfz Round 6 「Cfz Round 6」Imaichi
  • 【PHP】通过IP获取IP所在地理位置(免费API接口)
  • Kruskal算法
  • gTest测试框架的安装与配置