【C++指南】STL list容器完全解讀(一):從入門到掌握基礎操作

.

💓 博客主頁:倔強的石頭的CSDN主頁
📝Gitee主頁:倔強的石頭的gitee主頁
? 文章專欄:《C++指南》
期待您的關注
在這里插入圖片描述

文章目錄

    • 一、初識list容器
      • 1.1 什么是list?
      • 1.2 核心特性
      • 1.3 典型應用場景
    • 二、核心成員函數
      • 2.1 默認成員函數
    • 三、迭代器操作
      • 3.1 基礎迭代器
      • 3.2 常量迭代器(C++11)
    • 四、容量與訪問操作
      • 4.1 容量查詢
      • 4.2 元素訪問
    • 五、修改操作詳解
      • 5.1 基礎修改函數
      • 5.2 高級修改操作
      • 5.3 插入與刪除
        • insert重載版本
        • erase操作
    • 六、特殊成員函數
      • 6.1 條件操作
      • 6.2 鏈表特有操作
    • 七、總結與進階

一、初識list容器

1.1 什么是list?

在C++標準模板庫(STL)中,list是一個基于雙向鏈表實現的序列容器。它允許在任意位置進行高效插入和刪除操作,時間復雜度為O(1)。與vector不同,list不保證元素在內存中的連續存儲,因此不支持隨機訪問。
在這里插入圖片描述

1.2 核心特性

  • 雙向鏈表結構:每個元素包含指向前后節點的指針
  • 動態內存分配:元素按需分配內存
  • 高效插入刪除:無需移動其他元素
  • 迭代器穩定性:插入刪除操作不會使已有迭代器失效(除被刪除元素)

1.3 典型應用場景

  • 需要頻繁在首尾之外的位置插入/刪除元素
  • 元素體積較大,避免vector擴容時的拷貝開銷
  • 需要維護元素的插入順序
  • 需要合并、拆分鏈表等特殊操作

二、核心成員函數

2.1 默認成員函數

在這里插入圖片描述
構造函數的重載版本
在這里插入圖片描述

函數功能描述示例
默認構造函數創建空listlist<int> lst1;
填充構造函數創建包含n個元素的listlist<char> lst2(5);
拷貝構造函數復制另一個list的內容list<int> lst3(lst2);
移動構造函數(C++11)轉移另一個list的資源list<int> lst4(move(lst3));
析構函數自動釋放內存(通常無需手動調用)lst1.~list();
拷貝賦值運算符深拷貝賦值操作lst2 = lst1;
移動賦值運算符(C++11)高效轉移資源賦值操作lst3 = move(lst2);
// 初始化列表構造(C++11)
list<string> fruits {"apple", "banana", "cherry"};

三、迭代器操作

在這里插入圖片描述

3.1 基礎迭代器

函數功能示例
begin()返回指向第一個元素的迭代器auto it = lst.begin();
end()返回末尾哨兵迭代器while(it != lst.end())
rbegin()返回反向起始迭代器auto rit = lst.rbegin();
rend()返回反向結束迭代器for(; rit != lst.rend();)

3.2 常量迭代器(C++11)

函數功能示例
cbegin()返回不可修改的正向起始迭代器auto cit = lst.cbegin();
cend()返回不可修改的正向結束迭代器if(cit == lst.cend())
crbegin()返回不可修改的反向起始迭代器auto crit = lst.crbegin();
crend()返回不可修改的反向結束迭代器while(crit != lst.crend())
list<int> nums {1,2,3};
// 正向遍歷
for(auto it = nums.begin(); it != nums.end(); ++it) {cout << *it << " ";  // 輸出:1 2 3
}

四、容量與訪問操作

在這里插入圖片描述

4.1 容量查詢

函數功能示例
size()返回元素數量if(lst.size() > 5)
empty()判斷容器是否為空while(!lst.empty())

4.2 元素訪問

函數功能示例
front()訪問首元素(可修改)lst.front() = 10;
back()訪問尾元素(可修改)cout << lst.back();
list<double> temps {36.5, 37.1, 38.0};
temps.front() = 35.9;  // 修改首元素
cout << "當前體溫:" << temps.back();  // 輸出38.0

五、修改操作詳解

在這里插入圖片描述

5.1 基礎修改函數

函數功能示例
push_front(val)頭部插入元素lst.push_front(0);
emplace_front(args)頭部直接構造元素lst.emplace_front("test");
pop_front()刪除頭部元素lst.pop_front();
push_back(val)尾部插入元素lst.push_back(100);
emplace_back(args)尾部直接構造元素lst.emplace_back(1,2);
pop_back()刪除尾部元素lst.pop_back();
clear()清空所有元素lst.clear();

push_back vs emplace_back

class Student {
public:Student(int id, string name) : id(id), name(name) {}
private:int id;string name;
};list<Student> roster;
roster.push_back(Student(101, "Alice"));  // 構造臨時對象+拷貝
roster.emplace_back(102, "Bob");         // 直接構造(高效)

5.2 高級修改操作

函數功能示例
assign(n, val)用n個val替換內容lst.assign(5, 0);
assign(beg, end)用迭代器范圍替換內容lst.assign(vec.begin(), vec.end());
swap(other)交換兩個list的內容lst1.swap(lst2);
resize(n)調整元素數量lst.resize(10);
resize(n, val)調整數量并用val填充新增元素lst.resize(15, -1);
list<int> nums;
nums.assign({1,2,3});       // 內容變為[1,2,3]
nums.resize(5);             // 變為[1,2,3,0,0]
nums.resize(3);             // 截斷為[1,2,3]

5.3 插入與刪除

insert重載版本
iterator insert(iterator pos, const T& val);  // 單元素插入
void insert(iterator pos, size_t n, const T& val); // 批量插入
void insert(iterator pos, InputIt first, InputIt last); // 范圍插入
erase操作
iterator erase(iterator pos);                 // 刪除單個元素
iterator erase(iterator first, iterator last); // 刪除區間元素

示例

list<int> data {10,20,30};
auto it = data.begin();
advance(it, 1);data.insert(it, 15);        // [10,15,20,30]
data.insert(it, 2, 18);     // [10,15,18,18,20,30]
vector<int> tmp {25,35};
data.insert(data.end(), tmp.begin(), tmp.end()); // 末尾追加data.erase(it);             // 刪除第二個18

六、特殊成員函數

在這里插入圖片描述

6.1 條件操作

函數功能示例
remove(val)刪除所有等于val的元素lst.remove(5);
remove_if(pred)刪除滿足條件的元素lst.remove_if([](int n){ return n%2==0; });
list<int> nums {1,2,3,2,5};
nums.remove(2);  // 刪除所有2 → [1,3,5]
nums.remove_if([](int x){ return x>3; }); // → [1,3]

6.2 鏈表特有操作

函數功能示例
unique()刪除連續重復元素lst.unique();
merge(other)合并有序鏈表lst1.merge(lst2);
sort()排序元素(升序)lst.sort();
splice(pos, other)轉移另一個鏈表的元素lst1.splice(it, lst2);
list<int> a {1,3,5}, b {2,4,6};
a.merge(b);       // a變為[1,2,3,4,5,6], b為空
a.sort();         // 排序(若未有序)list<int> x {10,20}, y {30,40};
auto pos = x.begin();
x.splice(pos, y); // x變為[30,40,10,20], y為空

七、總結與進階

本文詳細介紹了C++ list容器的基本特性和使用方法。通過大量的代碼示例,我們學習了如何正確使用list進行元素的增刪改查操作。list作為STL中重要的序列式容器,其獨特的鏈表結構使其在特定場景下具有不可替代的優勢。

在接下來的系列文章中,我們將深入探討:

  • list的高級應用技巧
  • list在實際項目中的最佳實踐案例

下篇預告:《【C++指南】C++ list容器完全解讀(二):list模擬實現,底層架構揭秘》,我們將通過剖析STL源碼實現,帶你理解list的底層工作機制

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

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

相關文章

labelimg快捷鍵

一、核心標注快捷鍵 ?W?&#xff1a;調出標注十字架&#xff0c;開始繪制矩形框&#xff08;最常用功能&#xff09;?A/D?&#xff1a;切換上一張(A)或下一張(D)圖片&#xff0c;實現快速導航?Del?&#xff1a;刪除當前選中的標注框 二、文件操作快捷鍵 ?CtrlS?&…

linux-文件操作

在 Linux 系統中&#xff0c;文件操作與管理是日常使用和系統管理的重要組成部分。下面將詳細介紹文件的復制、移動、鏈接創建&#xff0c;以及文件查找、文本處理、排序、權限管理等相關知識。 一、文件的復制 在 Linux 里&#xff0c;cp 命令可用于復制文件或目錄&#xff…

C++ 復習

VS 修改 C 語言標準 右鍵項目-屬性 輸入輸出 //引用頭文件&#xff0c;用<>包裹起來的一般是系統提供的寫好的代碼 編譯器會在專門的系統路徑中去進行查找 #include <iostream> //自己寫的代碼文件一般都用""包裹起來 編譯器會在當前文件所在的目錄中査…

openGauss新特性 | HTAP新特性介紹

一、行列融合功能簡介 HTAP 行列融合特性在單機、主備場景下&#xff0c;通過節點的行列雙格式內存模式&#xff0c;實現openGauss HTAP一體化數據庫架構。 通過高效的行列轉換技術方案&#xff0c;節點讀取磁盤行存數據&#xff0c;生成列存儲單元&#xff08;Column Unit&am…

雙目測量中的將視差圖重投影成三維坐標圖

雙目測距主要步驟如下&#xff1a; 左右兩張圖片 → 匹配 → 得到視差圖 disp&#xff1b; 使用 cv2.reprojectImageTo3D(disp, Q) 將視差圖 重投影 成三維坐標圖 → 得到 points_3d 什么是 points_3d&#xff1f; points_3d cv2.reprojectImageTo3D(disp, Q)points_3d.shap…

《深度剖析:SOAP與REST,API集成的兩極選擇》

API作為不同系統之間交互的橋梁&#xff0c;其設計與實現的優劣直接影響著整個軟件生態的運轉效率。而在API的設計領域&#xff0c;SOAP和REST猶如兩座巍峨的山峰&#xff0c;各自代表著截然不同的設計理念與應用方向&#xff0c;成為開發者在構建API時必須慎重權衡的關鍵選項。…

非對稱加密算法(RSA、ECC、SM2)——密碼學基礎

對稱加密算法&#xff08;AES、ChaCha20和SM4&#xff09;Python實現——密碼學基礎(Python出現No module named “Crypto” 解決方案) 這篇的續篇&#xff0c;因此實踐部分少些&#xff1b; 文章目錄 一、非對稱加密算法基礎二、RSA算法2.1 RSA原理與數學基礎2.2 RSA密鑰長度…

Pillow 玩圖術:輕松獲取圖片尺寸和顏色模式

前言 在這個“圖像為王”的時代,誰還敢說自己沒被一張圖折磨過?一張圖片不講武德,說崩就崩,說卡就卡,仿佛像素里藏著程序員的眼淚。不管你是網頁設計師、AI煉丹師,還是只是想把貓片修得像藝術品,圖片的尺寸和顏色模式都是你必須掌握的第一手情報。如果你不知道它有多寬…

下載core5compat 模塊時,被禁止,顯示 - servese replied: Forbbidden. -->換鏡像源

怎么解決&#xff1f; --->換鏡像源 方法 1&#xff1a;使用命令行參數指定鏡像源 在運行 Qt 安裝器時&#xff0c;通過 --mirror 參數指定鏡像源&#xff1a; # Windows qt-unified-windows-x64-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject# Linux/macO…

WPF中Behaviors

行為的好處 可以把復雜的界面邏輯抽象出去&#xff0c;讓xaml的界面設計更簡單&#xff0c;更清爽 1.安裝包 Microsoft.Xaml.Behaviors.Wpf2.簡單實現拖動效果 <Border Width"100"Height"100"Background"Red"><i:Interaction.Behav…

GitHub 趨勢日報 (2025年05月03日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image? 1582? 59337Python2aip…

Oracle OCP認證考試考點詳解083系列08

題記&#xff1a; 本系列主要講解Oracle OCP認證考試考點&#xff08;題目&#xff09;&#xff0c;適用于19C/21C,跟著學OCP考試必過。 36. 第36題&#xff1a; 題目 解析及答案&#xff1a; 關于數據庫閃回&#xff08;FLASHBACK DATABASE&#xff09;功能&#xff0c;以下…

優化01-統計信息

Oracle 的統計信息是數據庫優化器生成高效執行計劃的核心依據。它記錄了數據庫對象&#xff08;如表、索引、列等&#xff09;的元數據信息&#xff0c;幫助優化器評估查詢成本并選擇最優執行路徑。以下是關于 Oracle 統計信息的詳細介紹&#xff1a; 一、統計信息的分類 表統…

動態規劃-面試題08.01三步問題-力扣(LeetCode)

一、題目解析 此題可以類比第N個泰波那契數 二、算法解析 1、狀態表示 根據上面的分析和題目要求&#xff0c;dp[i]表示&#xff1a;到達i位置&#xff0c;一共有多少種方法 2、狀態轉移方程 以i位置的狀態&#xff0c;以最近一步劃分問題 dp[i] 從i-1->i dp[i-1] 從…

kotlin中枚舉帶參數和不帶參數的區別

一 ? 代碼對比總結 第一段&#xff08;帶參數 工具方法&#xff09; enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…

Java使用JDBC操作數據庫

1.創建一個數據庫一會用來連接 2.使用idea新建一個Java項目 3.在pom文件中加上相關依賴&#xff0c;并配置Maven路徑 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>…

重名導致does not name a type

今天在Ubuntu24.04上編成時&#xff0c;makefile編譯報錯: falsecolor.h:48:9: error: ‘FalseColor’ does not name a type48 | FalseColor* content ;| ^~~~~~~~~~falsecolor.h的部分代碼如下: class FalseColor {public:FalseColor(int w, int h){width …

Vue3 后臺管理系統模板

Vue3 后臺管理系統模板 gie倉庫地址 一個基于 Vue3 TypeScript Element Plus 的后臺管理系統模板&#xff0c;集成了動態路由和權限管理功能。 技術棧 Vue 3.2TypeScript 4.5Vue Router 4Vuex 4Element Plus 2.9AxiosLess 功能特性 &#x1f680; 基于 Vue3 最新技術棧開…

林業數智化轉型初步設計方案

最近應林業方面的朋友要求,幫助其設計了林業方面的數字化智能化轉型的方案設計,編寫了如下內容,供大家參考,林業方面主要有三大方向,即林業生態、生物災害和疫源疫病,目前已經建成了一些信息化系統,但在數字化智能化方面偏弱,就想著如何借助人工智能、物聯網、大數據和…

springboot單體項目的執行流程

首先就是啟動springboot項目&#xff0c;即執行主函數&#xff0c;這個主函數的類通常帶有SpingBootApplication注解&#xff0c;類中的main方法就是程序的入口。 啟動主函數后&#xff0c;SpringBoot會按特定順序加載配置文件&#xff0c;如application.properties或applicat…