C++ std::list概念與使用案例

C++ std::list 概念詳解

std::list 是 C++ 標準模板庫(STL)中的一個雙向鏈表容器。與 vectorarray 不同,它不保證元素在內存中連續存儲,而是通過指針將各個元素連接起來。

核心特性

  1. 雙向鏈表結構
    • 每個元素包含指向前驅和后繼的指針
    • 支持雙向遍歷(前向和后向)
  2. 時間復雜度
    • 任意位置插入/刪除:O(1)
    • 隨機訪問:O(n)(效率低)
    • 排序:O(n log n)(使用成員函數 sort()
  3. 內存特性
    • 非連續內存分配
    • 每個元素有額外指針開銷(前驅 + 后繼)
    • 不會導致迭代器失效(除被刪除元素)
  4. 迭代器類型
    • 雙向迭代器(支持 ++--
    • 不支持隨機訪問(不能 + n

常用成員函數

操作函數示例
插入元素push_back()list.push_back(10);
push_front()list.push_front(5);
insert()list.insert(it, 7);
刪除元素pop_back()list.pop_back();
pop_front()list.pop_front();
erase()list.erase(it);
訪問元素front()int first = list.front()
back()int last = list.back()
容量操作size()int len = list.size()
empty()if (list.empty()) ...
特殊操作splice()list1.splice(pos, list2)
sort()list.sort();
merge()list1.merge(list2);
reverse()list.reverse();

使用案例:訂單管理系統

#include <iostream>
#include <list>
#include <string>
#include <algorithm>// 訂單結構
struct Order {int id;std::string customer;double amount;Order(int i, std::string c, double a) : id(i), customer(c), amount(a) {}
};int main() {// 創建訂單鏈表std::list<Order> orders;// 添加訂單(三種方式)orders.push_back(Order(101, "Alice", 150.0));     // 尾部添加orders.emplace_back(102, "Bob", 99.99);           // 直接構造(C++11)orders.push_front(Order(100, "VIP", 500.0));      // 頭部添加// 在特定位置插入auto it = orders.begin();std::advance(it, 2);  // 移動到第三個位置orders.insert(it, Order(103, "Charlie", 75.5));// 遍歷并打印訂單(C++11范圍循環)std::cout << "All Orders:\n";for (const auto& order : orders) {std::cout << "ID: " << order.id << ", Customer: " << order.customer << ", Amount: $" << order.amount << "\n";}// 刪除特定訂單(金額<100)orders.remove_if([](const Order& o) {return o.amount < 100.0;});// 按金額升序排序orders.sort([](const Order& a, const Order& b) {return a.amount < b.amount;});// 新訂單批次std::list<Order> newOrders = {{201, "David", 200.0},{202, "Eva", 350.0}};// 合并訂單(到鏈表尾部)orders.splice(orders.end(), newOrders);// 遍歷打印最終訂單std::cout << "\nFinal Orders (Sorted & Merged):\n";for (const auto& order : orders) {std::cout << "ID: " << order.id << ", Customer: " << order.customer << ", Amount: $" << order.amount << "\n";}// 查找特定訂單auto findIt = std::find_if(orders.begin(), orders.end(), [](const Order& o) { return o.customer == "Eva"; });if (findIt != orders.end()) {std::cout << "\nFound Eva's order: $" << findIt->amount << "\n";}return 0;
}
輸出示例:
All Orders:
ID: 100, Customer: VIP, Amount: $500
ID: 101, Customer: Alice, Amount: $150
ID: 103, Customer: Charlie, Amount: $75.5
ID: 102, Customer: Bob, Amount: $99.99Final Orders (Sorted & Merged):
ID: 103, Customer: Charlie, Amount: $75.5
ID: 102, Customer: Bob, Amount: $99.99
ID: 101, Customer: Alice, Amount: $150
ID: 201, Customer: David, Amount: $200
ID: 202, Customer: Eva, Amount: $350
ID: 100, Customer: VIP, Amount: $500Found Eva's order: $350

關鍵操作詳解

  1. 高效插入/刪除

    // 在任意位置插入(O(1))
    auto it = orders.begin();
    std::advance(it, 3);
    orders.insert(it, Order(105, "Frank", 120.0));// 刪除指定位置元素(O(1))
    orders.erase(it);
    
  2. 鏈表拼接

    // 將list2的所有元素移動到list1的指定位置
    list1.splice(position, list2);// 移動list2中的單個元素
    list1.splice(pos, list2, elementIt);// 移動list2中的元素范圍
    list1.splice(pos, list2, startIt, endIt);
    
  3. 專用排序算法

    // 成員函數sort(比std::sort更高效)
    orders.sort(); // 默認使用operator<// 自定義排序
    orders.sort([](const Order& a, const Order& b) {return a.amount > b.amount; // 按金額降序
    });
    
  4. 鏈表合并

    // 合并兩個有序鏈表
    list1.merge(list2); 
    // 注意:合并后list2為空
    

性能對比(vs vector)

操作std::liststd::vector
隨機訪問O(n)O(1)
頭部插入/刪除O(1)O(n)
尾部插入/刪除O(1)O(1) 攤銷
中間插入O(1)O(n)
內存連續性
內存開銷高(指針)

最佳實踐

  1. 適用場景

    • 需要頻繁在任意位置插入/刪除
    • 不需要隨機訪問
    • 需要穩定迭代器(不失效)
    • 需要高效合并/拆分操作
  2. 不適用場景

    • 需要隨機訪問元素
    • 內存受限環境
    • 需要緩存友好的操作
  3. 現代C++技巧

    // 結構化綁定(C++17)
    for (const auto& [id, customer, amount] : orders) {std::cout << customer << ": $" << amount << "\n";
    }// 自定義內存分配器
    std::list<int, MyAllocator> customList;
    

經典應用場景

  1. LRU緩存實現:使用鏈表+哈希表
  2. 撤銷/重做功能:維護操作歷史
  3. 消息隊列系統:高效插入/刪除
  4. 圖算法:鄰接表表示
  5. 多線程任務池:任務調度

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

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

相關文章

從0到1學Pandas(六):Pandas 與數據庫交互

目錄一、數據庫基礎操作1.1 連接數據庫1.2 執行 SQL 查詢1.3 創建與修改表結構二、數據導入導出2.1 從數據庫讀取數據2.2 將數據寫入數據庫2.3 大數據量處理三、數據庫事務處理3.1 事務概念與實現3.2 批量數據更新3.3 錯誤處理與回滾四、數據庫性能優化4.1 查詢性能優化4.2 連接…

GitHub 趨勢日報 (2025年07月26日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖602Qwen3-Coder573neko527hrms275BillionMail153Win11Debloat115hyperswitch57data…

機器人仿真(2)Ubuntu24.04下RTX5090配置IsaacSim與IsaacLab

目錄 一、前言二、電腦配置三、配置步驟3.1 創建Conda環境3.2 安裝PyTorch3.3 安裝Isaac Sim3.4 安裝Isaac Lab 四、總結 一、前言 博主自從去年開始就一直在關注Isaac Lab和Isaac Sim&#xff0c;但是一直以來由于手頭設備只有4060&#xff0c;甚至沒有達到最低配置16GB顯存要…

DaVinci Resolve 19.0(達芬奇)軟件安裝包下載及詳細安裝教程|附帶安裝文件

[軟件名稱]&#xff1a;ArcGIS [軟件大小]&#xff1a;2.99 GB [系統要求]&#xff1a;支持Win7及更高版本 [下載通道]: 迅雷網盤 [下載鏈接]:高速下載地址 https://pan.xunlei.com/s/VOW9nw-JV99A_7f_5hhpgqO2A1?pwdbufh# ??:先用手機下載迅雷網盤保存到手機中&#xff0c…

Java學習第八十一部分——Shiro

目錄 &#x1f4eb; 一、前言提要簡介 &#x1f6e1;? 二、核心功能介紹 ?? 三、核心架構組件 ? 四、與Java的關系 ?? 五、與Spring Security對比 &#x1f9e9; 六、典型應用場景 &#x1f48e; 七、總結歸納概述 &#x1f4eb; 一、前言提要簡介 Apache Shiro 是…

虛擬機ubuntu20.04共享安裝文件夾

ubuntu20.04共享安裝文件夾 4.5 共享安裝文件夾 將Windows存放安裝文件的文件夾共享給虛擬機&#xff0c;如下圖操作&#xff1a;如果是在ubuntu20.04中&#xff0c;還需要以下的操作&#xff1a; sudo mkdir /mnt/hgfs 此命令無效 sudo echo ‘vmhgfs-fuse /mnt/hgfs fu…

如何查看電腦后門IP和流量?

你是否也有以下經歷&#xff1f;深夜&#xff0c;你的電腦風扇突然狂轉&#xff0c;屏幕卻一片寂靜&#xff1b;每月流量莫名超標&#xff0c;賬單高得離譜&#xff1b;鼠標偶爾不聽使喚…這些可能不是電腦“鬧脾氣”&#xff0c;如何一探究竟&#xff1f; 想象一下&#xff1a…

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測 目錄分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測分類效果基本介紹多策略量子自適應螺旋搜索算法研究摘要1. 引言1.1 研究背景1.2 研究意義1.3 研究目標2. 文…

Android 修改系統時間源碼閱讀

鏈接&#xff1a;XRefAndroid - Support Android 16.0 & OpenHarmony 5.0 (AndroidXRef/AospXRef) 這里看的Android 10的代碼&#xff0c;選中Android 10&#xff0c;勾選所有工程&#xff0c;搜索DateTimeSettings?&#xff1a; 看到showTimePicker應該是顯示一個設置時…

關于自定義域和 GitHub Pages(Windows)

GitHub Pages 支持使用自定義域,或將站點 URL 的根目錄從默認值(例如 )更改為您擁有的任何域,比如octocat.github.io。 誰可以使用此功能? GitHub Pages 在公共存儲庫中提供 GitHub Free 和 GitHub Free for organizations,在公共和私有存儲庫中提供 GitHub Pro、GitHub …

自動駕駛領域中的Python機器學習

數據預處理與特征工程 在自動駕駛系統中&#xff0c;數據是驅動決策的核心。從傳感器&#xff08;如攝像頭、激光雷達、毫米波雷達&#xff09;收集的原始數據通常包含噪聲、缺失值和異常值&#xff0c;需要進行系統的預處理。Python的pandas庫提供了強大的數據處理能力&#x…

PROFINET轉CAN通訊協議轉換速通汽車制造

在汽車系統領域之外&#xff0c;控制器局域網&#xff08;CAN&#xff09;總線技術亦廣泛應用于多種工業環境。其固有的穩健性、可靠性與靈活性&#xff0c;使其成為工業自動化及控制系統中設備間通信的理想選擇。CAN 總線技術在工業應用中的關鍵領域包括機器控制、傳感器網絡以…

影刀RPA_小紅書筆記批量采集_源碼解讀

一、項目簡介本項目是一個基于影刀RPA的小紅書筆記批量采集工具&#xff0c;能夠通過兩種模式獲取小紅書平臺的軟文數據&#xff1a;搜索內容抓取和自定義鏈接抓取。工具使用Chrome瀏覽器自動化技術&#xff0c;實現了從網頁數據采集、解析到Excel導出的完整流程。支持獲取筆記…

以使命為帆,結業是重新出發的號角

站在私教班結業典禮的講臺上&#xff0c;望著眼前一張張閃爍著力量的面孔&#xff0c;我心中始終縈繞著一個信念&#xff1a;所有的相遇&#xff0c;都是為了共同奔赴一件更有意義的事。今天不是終點&#xff0c;而是 “使命的啟程”—— 我們因不甘而相聚&#xff1a;不甘心行…

java測試題(下)

1. Spring 核心概念1.1 如何理解 Spring DI&#xff1f;DI&#xff08;依賴注入&#xff09; 是 IoC&#xff08;控制反轉&#xff09; 的具體實現方式&#xff0c;由 Spring 容器在運行時通過以下方式自動注入依賴&#xff1a;構造器注入&#xff08;推薦&#xff09;Setter 注…

LC振蕩Multisim仿真

電路圖&#xff1a;說明&#xff1a;點擊仿真后&#xff0c;先打開S1&#xff0c;可以看到C1的充電曲線。當電容充滿電后&#xff0c;關閉S1&#xff0c;打開S2&#xff0c;這時候&#xff0c;C2電容會快速獲得C1一半的電量。如果沒有L&#xff0c;曲線會變得很陡。如果只加入電…

五、Web開發

文章目錄1. SpringMVC自動配置概覽2. 簡單功能分析2.1 靜態資源訪問2.1.1 靜態資源目錄2.1.2 靜態資源訪問前綴2.1.3 webjar2.2 歡迎頁支持2.3 自定義 Favicon2.4 靜態資源配置原理2.4.1 配置類只有一個有參構造器2.4.2 資源處理的默認規則2.4.3 歡迎頁的處理規則2.4.4 favicon…

Mysql 二進制安裝常見問題

1. mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory在centos9中升級了libncurses.so的版本為libncurses.so.6&#xff0c;所以找不到libncurses.so.5需要使用軟連接指向libncurses.so.6ln -s /lib6…

OpenLayers 綜合案例-點位聚合

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

測試老鳥整理,物流項目系統測試+測試點分析(一)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 物流項目&#xf…