C++:list(1)list的使用

list的使用

  • 一.list基本的結構
      • 1.環狀雙向鏈表
      • 2.哨兵節點
      • 3.迭代器
      • 4.節點結構
      • 5.鏈表遍歷
      • 6.迭代器失效
  • 二.list的基本使用
      • 1.`test01`函數:主要測試`std::list`的初始化方式及遍歷
      • 2.`test02`函數:主要測試`std::list`的常用成員函數操作
      • 3.測試結果如下
  • 三.list的其他操作(了解)
      • 2. remove(按值移除)
      • 3. remove_if(按條件移除)
      • 4. unique(移除相鄰重復)
      • 5. merge(合并有序鏈表)
      • 6. reverse(反轉元素順序)

一.list基本的結構

在這里插入圖片描述
以上圖片展示了一個 C++ 標準庫中的 std::list 容器的內部結構:

1.環狀雙向鏈表

  • std::list 是環狀雙向鏈表。
  • 最后一個節點的 next 指向頭節點。
  • 頭節點的 prev 指向最后一個節點。

2.哨兵節點

  • 圖中紅色方框標注的是哨兵節點。
  • 哨兵節點不存儲實際數據。
  • 哨兵節點的 next 指向第一個數據節點。
  • 哨兵節點的 prev 指向最后一個數據節點。

3.迭代器

  • begin() 返回指向第一個數據節點的迭代器。
  • end() 返回指向哨兵節點的迭代器。
  • 迭代器通過 _M_node 指針訪問節點。

4.節點結構

  • 每個節點包含數據值(如圖中 0、2、3、4 等)。
  • 包含指向前一個節點的指針(prev)。
  • 包含指向后一個節點的指針(next)。

5.鏈表遍歷

  • 正向遍歷:從 begin() 開始,通過 next 指針依次訪問節點。
  • 逆向遍歷:從 end() 開始,通過 prev 指針依次訪問節點。

6.迭代器失效

  • 當鏈表結構改變時(如插入或刪除節點),迭代器可能失效。
  • 失效的迭代器不能再用于訪問鏈表。

二.list的基本使用

對C++ 標準庫中 std::list 容器部分成員函數的測試。展示了std::list 的多種操作方式,包括初始化、插入元素、調整大小、刪除元素等。

#include<iostream>
#include<list>
#include<vector>
using namespace std;// 測試 list 的初始化和基本遍歷
void test01()
{// 默認構造函數創建空列表list<int> lt1;// 使用初始化列表構造列表list<int> lt2 = { 0,1,2,3,4,5 };// 創建包含10個元素的列表,每個元素初始化為1list<int> lt3(10, 1);// 從數組中前5個元素構造列表int a[] = { 5,4,3,2,1,0 };list<int> lt4(a, a + 5);// 正確遍歷方法:基于范圍的for循環cout << "lt4: ";for (auto e : lt4){cout << e << " ";}cout << endl;
}// 測試 list 的插入、修改和刪除操作
void test02()
{// 使用初始化列表構造并插入元素list<int> lt1 = { 0,1,2,3,4,5 };lt1.insert(lt1.begin(), 666);  // 在頭部插入元素// 復制構造list<int> lt2(lt1);lt2.push_back(999);           // 在尾部添加元素lt2.resize(10, 77);           // 調整大小,不足部分用77填充cout << "lt2: ";for (auto e : lt2){cout << e << " ";}cout << endl;// 復制列表并調整大小(截斷)list<int> lt3 = lt2;lt3.resize(5, 0);             // 調整為5個元素,超出部分截斷cout << "lt3: ";for (auto e : lt3){cout << e << " ";}cout << endl;// 刪除特定值的所有元素list<int> lt4(lt2);lt4.remove(77);               // 刪除所有值為77的元素cout << "lt4: ";for (auto e : lt4){cout << e << " ";}cout << endl;
}int main() {test01();cout << endl;test02();return 0;
}

以下是對代碼中test01test02函數測試內容的分要點梳理:

1.test01函數:主要測試std::list的初始化方式及遍歷

  1. 初始化測試

    • 默認構造:list<int> lt1;(創建空列表)
    • 初始化列表構造:list<int> lt2 = {0,1,2,3,4,5};(用初始化列表直接賦值元素)
    • 指定大小和值構造:list<int> lt3(10, 1);(創建包含10個元素、每個元素值為1的列表)
    • 數組范圍構造:list<int> lt4(a, a + 5);(用數組a中從aa+5的元素初始化列表,即取前5個元素5,4,3,2,1
  2. 遍歷測試

    • 使用基于范圍的for循環遍歷lt4并輸出元素,驗證初始化結果是否正確。

2.test02函數:主要測試std::list的常用成員函數操作

  1. 插入操作

    • lt1.insert(lt1.begin(), 666);:在lt1的開頭位置插入元素666
  2. 復制構造

    • list<int> lt2(lt1);:通過復制構造函數,創建lt1的副本lt2
  3. 尾部添加

    • lt2.push_back(999);:在lt2的末尾添加元素999
  4. 調整大小

    • lt2.resize(10, 77);:將lt2的大小調整為10,若原大小不足,用77填充剩余位置。
    • lt3.resize(5, 0);:將lt3的大小調整為5,若原大小超出,截斷多余元素(填充值0在此處無效,因僅截斷不新增)。
  5. 刪除元素

    • lt4.remove(77);:刪除lt4中所有值為77的元素。
  6. 遍歷輸出

    • 所有列表均通過基于范圍的for循環遍歷輸出,驗證上述操作的結果是否正確。

3.測試結果如下

lt4: 5 4 3 2 1 lt2: 666 0 1 2 3 4 5 999 77 77 
lt3: 666 0 1 2 3 
lt4: 666 0 1 2 3 4 5 999 

三.list的其他操作(了解)

在這里插入圖片描述### 1. splice(轉移元素)

  • 核心功能:把一個 list 里的元素(單個、區間或整個鏈表)轉移到另一個 list 里,原 list 對應元素會被移除。
  • 關鍵特點
    • 高效:直接調整鏈表指針,不用拷貝元素,處理大數據量時速度優勢明顯。
    • “搬家式” 轉移:原 list 被轉移的元素位置會 “空出來”,目標 list 把這些元素 “接過去” 。
  • 典型場景:需要在不同鏈表間快速調整元素歸屬,比如鏈表拼接、拆分邏輯,像合并訂單鏈表時,把臨時鏈表的訂單直接轉移到主鏈表 。

2. remove(按值移除)

  • 核心功能:遍歷鏈表,把所有值和指定值一樣的元素都刪掉。
  • 關鍵特點
    • 精準定值刪除:簡單直接,給定一個具體值(如 5 ),就能清理鏈表里所有該值的元素。
    • 遍歷式刪除:逐個檢查元素值,匹配就刪除,適合明確知道要刪什么值的場景。
  • 典型場景:數據清理時,刪除鏈表中特定標識的元素,比如用戶鏈表刪除 ID 為 001 的用戶記錄 。

3. remove_if(按條件移除)

  • 核心功能:依據自定義條件(像元素大小、是否滿足某種規則),刪除符合條件的元素。
  • 關鍵特點
    • 靈活自定義:用 lambda 表達式、函數對象等設定條件(比如刪偶數、刪大于某個閾值的數 ),應對復雜刪除需求。
    • 邏輯拓展性強:不管是簡單的數值判斷,還是涉及元素對象屬性的復雜邏輯,都能實現刪除。
  • 典型場景:業務規則篩選刪除,比如訂單鏈表刪除金額小于 1 元的無效訂單,學生鏈表刪除成績不及格的記錄 。

4. unique(移除相鄰重復)

  • 核心功能:去掉鏈表中相鄰的重復元素,只留一個。若要整體去重,一般得先排序讓重復元素相鄰。
  • 關鍵特點
    • 相鄰限定:只處理 “緊挨著” 的重復,沒排序的話,分散的重復元素刪不掉。
    • 簡化存儲:適合對連續重復數據做 “壓縮”,像統計鏈表中連續相同數值的個數后,保留一個代表值 。
  • 典型場景:處理傳感器連續采集的重復數據、文本處理中連續重復的字符(排序后去相鄰重復 ),比如日志鏈表清理連續重復的狀態記錄 。

5. merge(合并有序鏈表)

  • 核心功能:把兩個已經有序的鏈表合并成一個新的有序鏈表,原被合并的鏈表會被清空。
  • 關鍵特點
    • 前提條件:兩個鏈表自身得是有序的(升序或降序,需保持一致 ),否則合并結果會混亂。
    • 歸并特性:常和歸并排序搭配,拆分后合并有序子鏈表;也用于整合多個有序鏈表結果。
  • 典型場景:歸并排序算法里合并階段、合并多個按時間排序好的日志鏈表,比如服務器把不同時段有序的操作日志鏈表合并 。

6. reverse(反轉元素順序)

  • 核心功能:把鏈表中元素的順序完全顛倒,第一個變最后一個,最后一個變第一個。
  • 關鍵特點
    • 指針調整實現:通過修改鏈表節點間的指針指向,改變元素遍歷順序,不用額外空間拷貝。
    • 邏輯簡單直接:一步操作就能實現逆序,滿足逆序處理數據需求。
  • 典型場景:鏈表數據需要逆序展示(如聊天記錄從最新到最早展示時反轉 )、數學運算中鏈表存儲數字的逆序處理(像鏈表存 1->2->3 代表 123,反轉后計算 321 )。

以上這些要點清晰梳理了每個函數 “能干什么、有啥特點、啥時候用”,方便理解 list 這些操作在實際場景的價值 。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92456.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArcGIS地形起伏度計算

地形起伏度計算地形起伏度步驟1&#xff1a;計算最大值。步驟2&#xff1a;計算最小值。步驟3&#xff1a;計算地形起伏度。地形起伏度、地形粗糙度、地表切割深度和高程變異系數均為坡面復雜度因子&#xff0c;是一種宏觀的地形信息因子&#xff0c;反映的是較大的區域內地表坡…

llama factory新手初步運行完整版

1、新建conda環境名稱為llama_factory&#xff0c;并激活 conda create -n llama_factory python3.10 conda activate llama_factory2、激活后可檢查內部包是否純凈&#xff0c;要確保環境內包較純凈&#xff0c;不然后續安裝對應包會出現一系列水土不服的問題&#xff0c;導致…

Tomcat與JDK版本對照全解析:避坑指南與生產環境選型最佳實踐

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

短視頻矩陣的未來前景:機遇無限,挑戰并存

在當今數字化信息飛速傳播的時代&#xff0c;短視頻以其獨特的魅力迅速席卷全球&#xff0c;成為人們獲取信息、娛樂消遣的重要方式之一。短視頻矩陣作為一種高效的內容傳播與運營模式&#xff0c;正逐漸展現出其強大的影響力和潛力。本文將深入探討短視頻矩陣的未來前景&#…

【數據結構】哈希——位圖與布隆過濾器

目錄 位圖&#xff1a; 引入 位圖實現&#xff1a; 位圖的結構 插入數據(標記數據) 刪除數據(重置數據) 查找數據 位圖完整代碼&#xff1a; 位圖的優缺點&#xff1a; 布隆過濾器&#xff1a; 引入 布隆過濾器實現&#xff1a; 布隆過濾器的結構&#xff1a; 插入…

本地運行C++版StableDiffusion!開源應用StableVerce發布

本地運行C版StableDiffusion&#xff01;開源應用StableVerce發布 StableVerse是一個用C開發的本地運行的圖形工具。適合初學者快速入門&#xff1b;適用于辦公室工作人員的文本和圖像制作的小規模計算能力場景。 開源地址&#xff1a;https://github.com/kelvin-luo/StableVer…

OpenLayers 快速入門(七)矢量數據

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

【PTA數據結構 | C語言版】關于堆的判斷

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 將一系列給定數字順序插入一個初始為空的最小堆。隨后判斷一系列相關命題是否為真。命題分下列幾種&#xff1a; x is the root&#xff1a;x是根結點&#xff1b;x and y are siblings&#xff1a…

[CH582M入門第十步]藍牙從機

前言 學習目標: 1、初步了解BLE協議 2、BLE從機代碼解析 3、使用手機藍牙軟件控制CH582M從機LED亮滅一、藍牙介紹 藍牙(Bluetooth)是一種短距離無線通信技術,主要用于設備之間的數據傳輸和通信。它由愛立信(Ericsson)于1994年提出,現由藍牙技術聯盟(Bluetooth SIG)維…

力扣(LeetCode) ——輪轉數組(C語言)

題目&#xff1a;輪轉數組 給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數。 示例1&#xff1a; 輸入&#xff1a; nums [1,2,3,4,5,6,7]&#xff0c;k 3 輸出&#xff1a; [5,6,7,1,2,3,4] 解釋&#xff1a; 向右輪轉 1 步:…

Rocky9部署Zabbix7(小白的“升級打怪”成長之路)

目錄 一、關閉防火墻和SElinux和配置安裝源 二、zabbxi服務器配置 1、安裝Zabbix server&#xff0c;Web前端&#xff0c;agent &#xff0c;mysql-server 2、配置mysql數據庫 3、為Zabbix server配置數據庫 4、啟動對應服務 三、登錄zabbix 四、客戶端部署 五、解決中…

python安裝package和pycharm更改環境變量

安裝numpy包 1、找到對應python版本的numpy包的版本 NumPy - News確認適配python版本的numpy&#xff0c;我安裝 的python是3.11所以安裝的numpy是2.2.0 2、修改pip安裝的鏡像源 1、全局修改&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.c…

Redis中的setnx命令為什么是原子性的

Redis的SETNX命令是一個原子性操作&#xff0c;這得益于其單線程架構的特性。Redis采用單線程模型&#xff0c;所有命令都在主線程中順序執行&#xff0c;確保每個操作都具有原子性。執行SETNX時&#xff0c;Redis會首先檢查指定key是否存在&#xff1a;若不存在則設置值并返回…

深入解析Hadoop中的EditLog與FsImage持久化設計及Checkpoint機制

HDFS元數據管理概述在HDFS&#xff08;Hadoop Distributed File System&#xff09;的架構中&#xff0c;元數據管理是保證系統可靠性和性能的核心環節。NameNode作為HDFS的主節點&#xff0c;負責維護整個文件系統的命名空間和文件到數據塊的映射關系。這些元數據的高效管理直…

MFC類Qt的自動布局框架

由于作者習慣使用Qt&#xff0c;習慣了其框架下的水平和垂直布局。但在使用MFC時&#xff0c;卻發現并沒有十分好用的布局框架&#xff0c;檢索了部分資料&#xff0c;發現要么不提供源碼&#xff0c;要么方案不理想。搜索了很多資料&#xff0c;最終發現一個可用方案&#xff…

認識Transformer架構

一.前言前面我們介紹了RNN相關系列的模型&#xff0c;在當今大模型時代大家認識一下就好了&#xff0c;而本章節我們是要來介紹一下重中之重的Transformer模型&#xff0c;本章節就來介紹一下他的架構&#xff0c;了解Transformer模型的作?以及了解Transformer總體架構圖中各個…

Python學習之存數據

在得到了對應的數據之后可以考慮用文件或者數據庫的方式把內容持久化下來方便之后的分析&#xff0c;此時可以使用pymongo庫&#xff0c;寥寥幾行代碼&#xff0c;數據就已經很好地存儲下來。&#xff08;此處可參考我們之前發的文章)在 Python 中引入&#xff1a;import pymon…

PointLLM - ECCV 2024 Best Paper Candidate

https://github.com/OpenRobotLab/PointLLM PointLLM: Empowering Large Language Models to Understand Point Clouds 核心問題 對比兩種讓大型語言模型&#xff08;LLM&#xff09;“看懂”三維世界的方法 間接方法&#xff1a;通過2D圖像進行猜測。 這是目前比較常見但充…

前端-CSS-day6

目錄 1、相對定位 2、絕對定位 3、絕對定位-居中 4、固定定位 5、堆疊順序 6、CSS精靈-基本使用 7、案例-京東服務 8、字體圖標-體驗 9、使用字體圖標 10、垂直對齊方式 11、過渡 12、透明度 13、光標類型 14、綜合案例-輪播圖 1、相對定位 <!DOCTYPE html>…

在離線 Ubuntu 22.04機器上運行 ddkj_portainer-cn 鏡像 其他相關操作也可以復刻 docker

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址&#xff1a;星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 兌換碼要是過期了&#xff0c;可以私信我獲取最新兌換碼&#xff01;&a…