《C++》STL--list容器詳解

在 C++ 標準模板庫(STL)中,list 是一個非常重要的序列容器,它實現了雙向鏈表的數據結構。與 vector 和 deque 不同,list 提供了高效的插入和刪除操作,特別是在任意位置。本文將深入探討 list 容器的特性、使用方法以及常見操作。

文章目錄

  • 一、list 容器的基本特性
  • 二、list 的基本操作
    • 2.1 list的語法
    • 2.2 常用成員函數
    • 2.3 插入和刪除操作
  • 三、list 的高級特性
    • 3.1 迭代器使用
    • 3.2 排序和去重
    • 3.3 合并和拼接
  • 四、list對比其它容器的優劣勢
    • 4.1優勢
    • 4.2劣勢

一、list 容器的基本特性

list 是一個雙向鏈表容器,它有下面5個特點:

  • 雙向鏈表結構:每個元素都包含指向前驅和后繼的指針。

  • 非連續內存:元素存儲在任意內存位置,通過指針連接。

  • 高效的插入刪除:在任意位置插入和刪除元素的時間復雜度為 O(1)。

  • 不支持隨機訪問:不能像數組一樣通過下標直接訪問元素。

  • 迭代器穩定性:插入和刪除操作不會使迭代器失效(除了被刪除元素的迭代器)。

二、list 的基本操作

2.1 list的語法

  • 使用 list 前需要包含 頭文件:
#include <iostream>
#include <list>
using namespace std;
  • 初始化一個空的 list
    list<int> lst1;
  • 初始化包含 5 個元素,每個元素值為 10
    list<int> lst2(5, 10);
  • 通過初始化列表初始化
    list<int> lst3 = {1, 2, 3, 4, 5};
  • 通過數組初始化
    int arr[] = {6, 7, 8, 9, 10};list<int> lst4(arr, arr + sizeof(arr)/sizeof(arr[0]));

2.2 常用成員函數

定義一個list作為示例,將為大家演示一些常用的成員函數及其使用方法。

list<int> myList = {1, 2, 3};
  • 在末尾添加元素
myList.push_back(4);  // 1,2,3,4
  • 在開頭添加元素
myList.push_front(0); // 0,1,2,3,4
  • 獲取第一個和最后一個元素
cout << "Front: " << myList.front() << endl; // 0
cout << "Back: " << myList.back() << endl;   // 4
  • 刪除第一個和最后一個元素
myList.pop_front(); // 1,2,3,4
myList.pop_back();  // 1,2,3
  • 判斷 list 是否為空
if (!myList.empty()) {cout << "List size: " << myList.size() << endl; // 3
}

2.3 插入和刪除操作

list 的插入和刪除操作非常高效,定義一個list作為示例:

list<int> nums = {10, 20, 30, 40};
  • 在指定位置前插入元素
auto it = nums.begin();
advance(it, 2); // 移動到第3個元素位置
nums.insert(it, 25); // 10,20,25,30,40
  • 刪除指定位置的元素
it = nums.begin();
advance(it, 3);
nums.erase(it); // 10,20,25,40
  • 刪除所有值為20的元素
nums.remove(20); // 10,25,40
  • 刪除滿足條件的元素
nums.remove_if([](int n){ return n > 30; }); // 10,25

三、list 的高級特性

3.1 迭代器使用

由于 list 不支持隨機訪問,遍歷時必須使用迭代器。
我在這里定義一個string類型的list作為演示遍歷時的操作。(其實主要還是迭代器遍歷,但是范圍for也可以。其實范圍for內核本質就是迭代器啦)

list<string> names = {"Alice", "Bob", "Charlie"};
  • 使用迭代器遍歷
for (auto it = names.begin(); it != names.end(); ++it) {cout << *it << " ";
}
cout << endl;
  • 使用范圍for循環遍歷
for (const auto& name : names) {cout << name << " ";
}
cout << endl;

3.2 排序和去重

list 中,庫提供了專門的排序和去重成員函數,下面我創建一個int類型的list為大家一一演示其使用方法:

list<int> values = {3, 1, 4, 1, 5, 9, 2, 6};
  • 排序 (升序)
values.sort(); // 1,1,2,3,4,5,6,9
  • 降序排序
values.sort(greater<int>()); // 9,6,5,4,3,2,1,1
  • 去重 (必須先排序)
values.unique(); // 9,6,5,4,3,2,1
  • 自定義去重條件
values.unique([](int a, int b){ return abs(a-b) <= 1; });

3.3 合并和拼接

list 在合并和拼接提供了十分方便并且高效的庫函數:

  • 定義兩個list鏈表作為演示
list<int> list1 = {1, 3, 5};
list<int> list2 = {2, 4, 6};
  • 合并兩個有序list (list2會被清空)
list1.merge(list2); // list1: 1,2,3,4,5,6; list2: 空list<int> list3 = {7, 8, 9};
  • 拼接list (將list3的元素移動到list1的指定位置)
auto pos = list1.begin();
advance(pos, 3);
list1.splice(pos, list3); // list1: 1,2,3,7,8,9,4,5,6

下次我們寫算法題就可以不用像C語言那樣那么麻煩了…(手動狗頭)

四、list對比其它容器的優劣勢

4.1優勢

  • 適合頻繁插入刪除:當需要在序列中間頻繁插入刪除元素時,list 是最佳選擇

  • 適合大元素對象:當元素對象很大時,list 可能比 vector 更高效,因為不需要重新分配和復制

  • 不需要隨機訪問:如果不需要通過下標快速訪問元素

  • 迭代器穩定性高:需要保證插入刪除操作不影響其他元素的迭代器

4.2劣勢

    1. 內存開銷大
      • list 作為鏈表結構,每個元素都需要額外的指針空間來存儲前驅和后繼節點的地址:
struct ListNode {T data;            // 存儲的實際數據ListNode* prev;    // 指向前驅節點的指針ListNode* next;    // 指向后繼節點的指針
};
    1. 緩存不友好
    • 鏈表節點分散在內存各處,無法利用空間局部性。

    • 遍歷鏈表時幾乎每次訪問都會導致緩存缺失。

    • CPU 難以預測下一個節點的內存位置。

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

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

相關文章

Day 28:類的定義和方法

DAY 28 類的定義和方法 知識點學習 1. 類的定義 在Python中&#xff0c;類是創建對象的模板。使用class關鍵字來定義一個類。類名通常采用首字母大寫的命名方式&#xff08;PascalCase&#xff09;。 # 最簡單的類定義 class MyClass:pass # 使用pass占位符類的定義就像是…

OSPF綜合實驗報告冊

一、實驗拓撲二、實驗要求1、R4為ISP&#xff0c;其上只配置IP地址&#xff1b;R4與其他所直連設備間均使用公有IP&#xff1b; 2、R3-R5、R6、R7為MGRE環境&#xff0c;R3為中心站點&#xff1b; 3、整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b;除了R12有兩個環回&#x…

網絡層6——內部網關協議RIP、OSPF(重點)

目錄 一、基本概念 1、理想的路由算法應具備的特點 2、分層次的路由選擇協議 二、內部網關協議RIP 1、特點 2、路由交換信息 3、距離向量算法 4、壞消息傳送慢問題 5、RIP報文格式 三、內部網關協議OSPF 1、特點 2、其他特點 3、自治系統區域劃分 4、OSPF的5中分…

同品牌的系列廣告要如何保證宣傳的連貫性?

對于品牌的系列廣告而言&#xff0c;內容的連貫性十分重要。如果系列廣告之間缺乏內在聯系&#xff0c;不僅會削弱品牌形象的統一性&#xff0c;還可能導致用戶的認知混亂。保證宣傳內容的連貫性不是讓每則廣告完全相同&#xff0c;而是在變化中保持核心要素的一致性。我們該如…

深度學習:激活函數Activaton Function

一、為什么需要激活函數&#xff1f;神經網絡本質上是多個線性變換&#xff08;矩陣乘法&#xff09;疊加。如果沒有激活函數&#xff0c;即使疊加多層&#xff0c;整體仍等價于一個線性函數&#xff1a;這樣的網絡無法學習和擬合現實世界中復雜的非線性關系。激活函數的作用&a…

deepseek: 切分類和長函數到同名文件中

import re import sys import os import ast from tokenize import generate_tokens, COMMENT, STRING, NL, INDENT, DEDENT import iodef extract_entities(filename):"""提取類和函數到單獨文件"""with open(filename, r, encodingutf-8) as f…

新型融合肽遞送外泌體修飾可注射溫敏水凝膠用于骨再生

溫敏水凝膠因能模擬細胞外基質微環境&#xff0c;且具有原位注射性和形態適應性&#xff0c;在骨組織工程中應用廣泛。小腸黏膜下層&#xff08;SIS&#xff09;作為天然細胞外基質來源&#xff0c;富含 I 型和 III 型膠原蛋白及多種生物活性因子&#xff0c;其制備的水凝膠在組…

SPI接口的4種模式(根據時鐘極性和時鐘相位)

SPI&#xff08;Serial Peripheral Interface&#xff09; 接口根據時鐘極性&#xff08;CPOL&#xff09;和時鐘相位&#xff08;CPHA&#xff09;的不同組合&#xff0c;共有 4種工作模式。這些模式決定了數據采樣和傳輸的時序關系&#xff0c;是SPI通信中必須正確配置的關鍵…

Java:高頻面試知識分享2

HashSet 和 TreeSet 的區別&#xff1f;底層實現&#xff1a;HashSet 基于 HashMap 實現&#xff0c;使用哈希表存儲元素&#xff1b;TreeSet 基于 TreeMap&#xff0c;底層為紅黑樹。元素順序&#xff1a;HashSet 無序&#xff1b;TreeSet 會根據元素的自然順序或傳入的 Compa…

C語言習題講解-第九講- 常見錯誤分類等

C語言習題講解-第九講- 常見錯誤分類等1. C程序常見的錯誤分類不包含&#xff1a;&#xff08; &#xff09;2. 根據下面遞歸函數&#xff1a;調用函數 Fun(2) &#xff0c;返回值是多少&#xff08; &#xff09;3. 關于遞歸的描述錯誤的是&#xff1a;&#xff08; &#x…

A?算法(A-star algorithm)一種在路徑規劃和圖搜索中廣泛使用的啟發式搜索算法

A?A*A?算法&#xff08;A-star algorithm&#xff09;是一種在路徑規劃和圖搜索中廣泛使用的啟發式搜索算法&#xff0c;它結合了Dijkstra算法的廣度優先搜索思想和啟發式算法的效率優勢&#xff0c;能夠高效地找到從起點到終點的最短路徑。 1. 基本原理 A*算法的核心是通過估…

UniappDay06

1.填寫訂單-渲染基本信息 靜態結構&#xff08;分包&#xff09;封裝請求API import { http } from /utils/http import { OrderPreResult } from /types/orderexport const getmemberOrderPreAPI () > {return http<OrderPreResult>({method: GET,url: /member/orde…

論文略讀:GINGER: Grounded Information Nugget-Based Generation of Responses

SIGIR 2025用戶日益依賴對話助手&#xff08;如 ChatGPT&#xff09;來滿足多種信息需求&#xff0c;這些需求包括開放式問題、需要推理的間接回答&#xff0c;以及答案分布在多個段落中的復雜查詢RAG試圖通過在生成過程中引入檢索到的信息來解決這些問題但如何確保回應的透明性…

從內部保護你的網絡

想象一下&#xff0c;你是一家高端俱樂部的老板&#xff0c;商務貴賓們聚集在這里分享信息、放松身心。然后假設你雇傭了最頂尖的安保人員——“保鏢”——站在門口&#xff0c;確保你準確掌握所有進出的人員&#xff0c;并確保所有人的安全。不妨想象一下丹尼爾克雷格和杜安約…

Redis 中 ZipList 的級聯更新問題

ZipList 的結構ZipList 是 Redis 中用于實現 ZSet 的壓縮數據結構&#xff0c;其元素采用連續存儲方式&#xff0c;具有很高的內存緊湊性。ZipList 結構組成如下&#xff1a;zlbytes&#xff1a;4字節&#xff0c;記錄整個ziplist的字節數zltail&#xff1a;4字節&#xff0c;記…

【蒼穹外賣項目】Day05

&#x1f4d8;博客主頁&#xff1a;程序員葵安 &#x1faf6;感謝大家點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb; 一、Redis入門 Redis簡介 Redis是一個基于內存的 key-value 結構數據庫 基于內存存儲&#xff0c;讀寫性能高適合存儲熱點數據&#xff08;熱…

語音識別dolphin 學習筆記

目錄 Dolphin簡介 Dolphin 中共有 4 個模型&#xff0c;其中 2 個現在可用。 使用demo Dolphin簡介 Dolphin 是由 Dataocean AI 和清華大學合作開發的多語言、多任務語音識別模型。它支持東亞、南亞、東南亞和中東的 40 種東方語言&#xff0c;同時支持 22 種漢語方言。該模…

視頻生成中如何選擇GPU或NPU?

在視頻生成中選擇GPU還是NPU&#xff0c;核心是根據場景需求、技術約束和成本目標來匹配兩者的特性。以下是具體的決策框架和場景化建議&#xff1a; 核心決策依據&#xff1a;先明確你的“視頻生成需求” 選擇前需回答3個關鍵問題&#xff1a; 生成目標&#xff1a;視頻分辨率…

從豆瓣小組到深度洞察:一個基于Python的輿情分析爬蟲實踐

文章目錄 從豆瓣小組到深度洞察:一個基于Python的輿情分析爬蟲實踐 摘要 1. 背景 2. 需求分析 3. 技術選型與實現 3.1 總體架構 3.2 核心代碼解析 4. 難點分析與解決方案 5. 總結與展望 對爬蟲、逆向感興趣的同學可以查看文章,一對一小班教學:https://blog.csdn.net/weixin_…

RustDesk 使用教程

說明&#xff1a; 使用RustDesk 需要在不同的電腦安裝對應系統型號的客戶端&#xff0c;然后再去云服務器安裝一個服務端即可。 1、到網站下載客戶端&#xff1a;https://rustdesk.com/zh-cn/ 兩臺電腦安裝客戶端。 2、在云服務器安裝服務端 1&#xff09;官網教程&#xff1a;…