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.pswp.cn/diannao/94083.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94083.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94083.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔试真题】2024秋招京东后端开发岗位-第一批笔试

31.牛牛与切割机 有一个序列 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​ &#xff0c; 牛牛将对这个序列切割一刀&#xff08;划分分成两个不相交的非空序列&#xff0c;一个序列为 a1,...,apa_1,...,a_pa1​,...,ap​&#xff0c;另一个序列为 ap1,...,ana_{p1},...,a_na…

【整数转罗马数字】

思路计算数字的位数&#xff1a; 通过 while(x) 循环计算输入数字 num 的位数 n。提取各位数字&#xff1a; 将数字 num 的每一位分解并存储到 nums 数组中&#xff0c;顺序为从高位到低位。罗马数字映射&#xff1a; 使用固定数组 Roman 存储罗马数字符号&#xff1a;Roman {…

spring Scheduled注解详解

spirng Scheduled注解详解 用于标记需要安排执行的方法的注解。必须指定 cron、fixedDelay 或 fixedRate 中的恰好一个属性。 被标注的方法必须不接受任何参数。它通常会具有 void 类型的返回值&#xff1b;如果不是这样&#xff0c;那么在通过调度器调用该方法时&#xff0c;返…

新升级超值型系列32位单片机MM32G0005

灵动微推出的新型MM32G0005系列基于ArmCortex - M0内核&#xff0c;具备高可靠性、低功耗、高性价比等特性。Flash升级至64KB&#xff0c;SRAM为4KB&#xff0c;还有1KB Data Flash。Flash全温擦写次数超过10万次。采用24Pin封装&#xff0c;最多有22个IO。QFN20和TSSOP20封装与…

Spark SQL 的详细介绍

Spark SQL 是 Apache Spark 生态系统中用于处理结构化数据的模块&#xff0c;它将 SQL 查询与 Spark 的分布式计算能力相结合&#xff0c;提供了一种高效、灵活的方式来处理结构化和半结构化数据。以下是对 Spark SQL 的详细介绍&#xff1a;1. 核心定位与优势结构化数据处理&a…

【FreeRTOS】空闲任务与钩子函数原理、实现与功能详解

一、FreeRTOS空闲任务概述FreeRTOS中的空闲任务(Idle Task)是系统自动创建的一个特殊任务&#xff0c;具有最低优先级(优先级0)。当没有其他更高优先级的任务运行时&#xff0c;调度器就会运行空闲任务。空闲任务的主要功能系统资源回收&#xff1a;自动清理被删除任务的内存和…

imx6ull-驱动开发篇6——Linux 设备树语法

目录 前言 设备树 设备树概念 DTS、 DTB 和 DTC DTS 语法 .dtsi 头文件 设备节点 /根节点​​ 节点命名与标签 节点层次结构​ 属性数据类型​ 标准属性 compatible 属性 model 属性 status 属性 #address-cells 和#size-cells 属性 reg 属性 ranges 属性 n…

ansible简单playbook剧本例子2

1. 准备主机组[rootansible-master ansible_quickstart]# vim inventory/hosts[web:vars] ansible_port22 ansible_passwordAdmin123456[web] 192.168.100.1822.准备剧本 vim hello.yml--- - hosts: webremote_user: roottasks:- name: Ping the target hostsping:- name: 获取…

EmpService 和 EmpMapper接口的作用

在这个项目中&#xff0c;EmpService 和 EmpMapper 都定义接口&#xff0c;是基于面向接口编程&#xff08;Interface Oriented Programming&#xff0c;IOP&#xff09;的设计思想&#xff0c;这两种接口在项目中承担着不同的职责&#xff0c;具体说明如下&#xff1a; EmpSer…

【语音技术】什么是动态实体

目录 动态实体的定义和维度 1.1 动态实体的资源 1.2 生效维度 1.2.1 应用级 1.2.2 用户级 1.2.3 自定义级 2. 动态实体的上传及使用 2.1 WebAPI 2.1.1 授权认证 2.1.2 上传资源接口 2.1.2.1 参数说明 2.1.2.2 返回说明 2.1.3 查询打包状态 2.1.3.1 参数说明 2.1.…

STM32学习记录--Day3

今天了解了下I2C&#xff1a;1.I2C电路结构I2C通信示意图&#xff1a;数据传输阶段​​​​主→从模式​​&#xff08;写操作&#xff09;&#xff1a;主机控制SCL时钟&#xff08;把SCL拉低&#xff09;主机向SDA线发送数据&#xff08;每次8位1位ACK&#xff09;​​主←从模…

裂变数据看板:5个核心指标决定活动生死​

数据是裂变活动的“指南针”。本文详解曝光量、转化率、裂变系数等5大核心指标&#xff0c;结合工具与案例&#xff0c;教你用数据驱动活动优化&#xff0c;避免“自嗨式裂变”。​为什么数据是裂变的“生死线”&#xff1f;&#xff08;认知重构&#xff09; 很多企业裂变活动…

iOS 类存储 与 C# 类存储 的差异

C# 中类的代码&#xff08;包括方法、属性等成员&#xff09;的存储机制与 Objective-C 有显著差异&#xff0c;其核心依赖于 ​CLR&#xff08;公共语言运行时&#xff09;的方法表&#xff08;Method Table&#xff09;和虚拟方法表&#xff08;vtable&#xff09;机制&#…

Selenium自动化:轻松实现网页操控

selenium自动化 1 什么是 Selenium 自动化 Selenium 是一个用于 Web 应用程序测试的工具&#xff0c;支持多种浏览器&#xff08;如 Chrome、Firefox、Edge 等&#xff09;。WebDriver 是 Selenium 的核心组件&#xff0c;用于控制浏览器行为并执行自动化操作。元素定位是通过…

又开发了一个优雅的小工具!

在开源项目中&#xff0c;Issues是一个强大的功能&#xff0c;用于跟踪bug、功能请求和任务。然而&#xff0c;随着项目的发展&#xff0c;Issues可能会变得难以管理&#xff0c;特别是当你需要离线访问或进行深入分析时。 当然GitHub Issues除了上述功能以外&#xff0c;做在线…

【安装教程】Docker Desktop 安装与使用教程

文章目录一、环境要求二、安装步骤2.1 安装 WSL 2&#xff08;适用于非专业版 Windows 10 及 Windows 11&#xff09;2.2 安装 Docker Desktop2.3 汉化 DDocker Desktop2.4 卸载 Docker Desktop三、使用 Docker3.1验证安装3.2. 拉取镜像3.3. 运行容器3.4. 查看容器3.5.更改容器…

Hutool 的 WordTree(敏感词检测)

package cn.hutool.dfa;WordTree 继承自 HashMap<Character, WordTree>&#xff0c;表示一个字符到子树的映射&#xff0c;构成一颗“词树”&#xff08;类似 Trie 树&#xff09;&#xff0c;用于快速匹配字符串中的词语&#xff08;敏感词检测、关键词匹配等&#xff0…

Makefile 从入门到精通:自动化构建的艺术

引入 在软件开发的世界里&#xff0c;“编译” 是绕不开的环节&#xff0c;但手动编译大型项目时&#xff0c;重复输入编译命令的痛苦&#xff0c;相信每个开发者都深有体会。Makefile 作为自动化构建的基石&#xff0c;能让编译过程“一键完成”&#xff0c;甚至智能判断文件变…

利用DeepSeek将Rust程序的缓冲输出改写为C语言实现提高输出效率

在前面多语言测试中&#xff0c;遇到一个难以置信的问题&#xff0c;rust的输出到文件比c语言还快&#xff0c;这是不合情理的&#xff0c;通过对两者输出语句的比较&#xff0c;发现了不同。 rust程序在输出到stdout前有这么一句 let mut writer BufWriter::with_capacity(6…

Java Optional 类教程详解

一、Optional 类核心定位Optional 是 Java 8 引入的函数式容器类&#xff08;java.util.Optional&#xff09;&#xff0c;专为​​显式空值处理​​设计。其核心价值在于&#xff1a;消除 60% 以上的传统 null 检查代码通过类型系统强制空值声明&#xff0c;降低 NPE 风险支持…