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

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.xdnf.cn/news/16558.html

相关文章:

  • Elasticsearch索引设计与性能优化实战指南
  • 查询mac 安装所有python 版本
  • vscode开发微信小程序
  • 2411.按位或最大的最小子数组长度
  • 信息技术发展与区块链的崛起:深度解析与未来展望
  • 基于web的在线购物系统的设计与实现/在线商城的设计与实现
  • 【微信小程序】12、生物认证能力
  • 从字符串中“薅出”最长子串:LeetCode 340 Swift 解法全解析
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——7. AI赋能(上):训练你自己的YOLOv8瑕疵检测模型
  • RTSP协议详解与C++实现实例
  • 津发科技带你了解皮肤电信号中的SCL与SCR
  • 深度解读|美创科技参编国家标准《数字水印技术实现指南》
  • windows 获取 APK 文件的包名和启动 Activity 名称
  • Kafka——Kafka控制器
  • 深入浅出设计模式——创建型模式之建造者模式 Builder
  • pnpm 入门与实践指南
  • ZKmall开源商城架构工具链:Docker、k8s 部署与管理技巧
  • [leetcode] 实现 Trie (前缀树)
  • 暑期算法训练.10
  • 【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
  • 1 RAG三问
  • 云端文档管理新纪元:Paperless-ngx与cpolar打造的无边界文件生态
  • GO 开发环境安装及配置
  • 【21】C# 窗体应用WinForm ——图片框PictureBox属性、方法、实例应用
  • 【C++算法】80.BFS解决FloodFill算法_岛屿数量
  • 符号计算与算法实践|使用Maple教授​​群论​​和​​图论​​课程
  • 20250729使用WPS打开xlsx格式的电子表格时候隐藏显示fx的编辑栏的方法
  • 【数据可视化-74】电信用户流失数据可视化分析:Python + Pyecharts 炫酷大屏(含完整的数据,代码)
  • 如何在Linux系统下进行C语言程序的编写和debug测试
  • 建筑兔零基础python自学记录114|正则表达式(1)-18