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.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 風險支持…