C++ 之 【list的簡介、list 的構造函數、iterator、容量操作、元素訪問、增刪查改與迭代器失效】

目錄

1.list的介紹

2.list的使用

2.1 構造函數

2.2 iterator 的使用

2.3 容量操作

2.4 元素訪問

2.5 增刪查改

2.5.1頭插頭刪與尾插尾刪

2.5.2 insert 、erase 函數

2.5.3 clear、swap函數

2.5.4 關于find函數

3.迭代器失效


1.list的介紹

(1)list的底層通常實現為帶頭雙向循環鏈表,支持在任意位置插入、刪除

(2)鏈表中,每個節點包含:一個存儲數據的變量和指向前后兩個節點的指針

假設節點存儲的是int型的數據,則結構如下:

2.list的使用

詳細了解請參考文檔list - C++ Reference

下面只介紹一些常見接口:

2.1 構造函數

std::list()默認構造函數,創建一個空鏈表。std::list<int> l1;

std::list(size_type n,?

const T& val = T())???

創建一個包含?n?個元素的鏈表,所有元素初始化為?valstd::list<int> l3(3, 10);?→?{10, 10, 10}

template<class InputIt>

std::list(InputIt first, InputIt last)

使用迭代器范圍?[first, last)?初始化鏈表(拷貝范圍內的元素)。std::list<int> l4(v.begin(), v.end());(假設?v?是?{1, 2, 3}
std::list(const list& other)拷貝構造函數,創建一個與?other?內容相同的鏈表(深拷貝)。std::list<int> l5(l4);l5?內容與?l4?相同)

2.2 iterator 的使用

begin()返回指向鏈表第一個元素的迭代器(若鏈表為空,返回?end())。正向遍歷鏈表、插入/刪除頭部元素、作為范圍循環的起點。
end()返回指向鏈表尾后位置的迭代器(不指向任何有效元素,僅用于比較)。標記遍歷結束位置、作為范圍循環的終點、檢查鏈表是否為空(l.begin() == l.end())。
rbegin()返回指向鏈表最后一個元素的反向迭代器(邏輯上為鏈表的“反向開頭”)。反向遍歷鏈表、從末尾開始處理元素。
rend()返回指向鏈表“反向尾后”位置的迭代器(邏輯上為鏈表的“反向末尾”)。標記反向遍歷結束位置、作為反向范圍循環的終點。

假設鏈表被實現為 帶頭雙向循環鏈表,則迭代器示意如下

總結:

1. begin與end為正向迭代器,對迭代器執行++操作,迭代器向后移動?

2. rbegin與rend為反向迭代器,對迭代器執行++操作,迭代器向前移動

2.3 容量操作

empty() bool檢查鏈表是否為空(無元素)if (l.empty()) { std::cout << "鏈表為空!"; }
size()size_type返回鏈表中元素的數量(類型為?std::size_tstd::cout << "鏈表大小: " << l.size();

2.4 元素訪問

front()

返回鏈表第一個元素的引用

(可修改或讀取)。

int first = l.front();?

或?l.front() = 100;

back()

返回鏈表最后一個元素的引用

(可修改或讀取)。

int last = l.back();?

或?l.back() += 10;

2.5 增刪查改

2.5.1頭插頭刪與尾插尾刪

void push_front(const T& value);
?
在鏈表頭部插入元素lt.push_front(1);
void pop_front();刪除鏈表頭部元素。lt.pop_front();
void push_back(const T& value);
?
在鏈表尾部插入元素lt.push_back(1);
void pop_back();刪除鏈表尾部元素。lt.pop_back();

pop_front使begin()迭代器失效,pop_back使end()迭代器失效

其余的不失效

2.5.2 insert 、erase 函數

insert在指定位置?pos?前插入元素(支持單元素、重復元素、范圍插入)返回指向新插入元素的迭代器(對單元素插入)原有迭代器不失效
erase刪除指定位置或范圍的元素(支持單元素刪除、范圍刪除)返回指向被刪除元素后一個位置的迭代器。使被刪除元素的迭代器失效
void test1(){std::list<int> lst = {1, 2, 3, 4, 5};// 1. 單元素插入(在第二個位置插入 99)auto it = lst.begin();// 手動移動迭代器到第二個位置++it;auto insert_it = lst.insert(it, 99); // 在 it 前插入 99std::cout << "After single insert: ";for (int x : lst) {std::cout << x << " "; // 輸出: 1 99 2 3 4 5}std::cout << "\nInserted element: " << *insert_it << std::endl; // 輸出: 99// 2. 范圍插入(在第三個位置插入數組 {5, 6, 7})int arr[3] = {5, 6, 7};auto range_it = lst.begin();// 手動移動迭代器到第三個位置for(int i = 0; i < 3; ++i){++range_it;}lst.insert(range_it, arr, arr + 3); // 插入數組std::cout << "After range insert: ";for (int x : lst) {std::cout << x << " "; // 輸出: 1 99 2 5 6 7 3 4 5}// 3. 填充插入(在末尾插入 3 個 0)lst.insert(lst.end(), 3, 0); // 末尾插入 3 個 0std::cout << "\nAfter fill insert: ";for (int x : lst) {std::cout << x << " ";// 輸出: 1 99 2 5 6 7 3 4 5 0 0 0}// 1. 單元素刪除(刪除值為 99 的元素)auto delete_it = std::find(lst.begin(), lst.end(), 99); // 查找元素if (delete_it != lst.end()) {auto next_it = lst.erase(delete_it); // 刪除并返回下一個元素的迭代器std::cout << "After single erase: ";for (int x : lst) {std::cout << x << " "; // 輸出: 1 2 5 6 7 3 4 5 0 0 0}std::cout << "\nNext element after erase: " << *next_it << std::endl; // 輸出: 2}// 2. 范圍刪除(刪除從第二個到第四個元素)auto start_it = lst.begin();// 手動移動迭代器到第二個位置for (int i = 0; i < 1 && start_it != lst.end(); ++i, ++start_it);auto end_it = lst.begin();// 手動移動迭代器到第五個位置for (int i = 0; i < 4 && end_it != lst.end(); ++i, ++end_it);lst.erase(start_it, end_it); // 刪除 [start_it, end_it) 范圍內的元素std::cout << "After range erase: ";for (int x : lst) std::cout << x << " "; // 輸出: 1 3 4 5 0 0 0// 3. 邊界條件:刪除 end() 會導致未定義行為// lst.erase(lst.end()); // 錯誤:不能刪除 end()
}

2.5.3 clear、swap函數

void swap(list& other); 交換當前鏈表與?other?鏈表的所有元素(包括大小、節點和迭代器有效性)other:待交換的另一個?std::list?對象交換后,原鏈表的迭代器指向?other?的元素,反之亦然;
void clear();刪除鏈表中的所有元素,釋放所有節點內存

所有迭代器/引用失效

(鏈表變為空)

雖然使用swap函數后,原鏈表的迭代器指向?other?的元素,反之亦然,

但是開發者不要依賴交換后的迭代器/引用(除非明確知道它們指向另一個鏈表)

以避免潛在的邏輯錯誤和未定義行為

2.5.4 關于find函數

std::list 無find成員函數,調用標準庫中的find函數即可

3.迭代器失效

操作

失效的

迭代器/指針/引用類型

失效原因避免失效的方法
insert

不失效(插入位置及之前的迭代器、指針、引用

均有效)

std::list?是雙向鏈表,插入操作僅修改相鄰節點的指針,不移動現有節點,所以不失效無需特殊處理,直接使用插入后的迭代器繼續操作。
erase僅失效被刪除節點的迭代器、指針、引用erase?會釋放被刪除節點的內存,導致指向該節點的迭代器/指針/引用失效。

刪除前保存下一個節點的迭代器(如?auto next_it = it; ++next_it;),或使用返回值

it = list.erase(it)

clear所有迭代器、指針、引用均失效clear?會釋放鏈表中所有節點的內存,導致所有迭代器/指針/引用失效。清空后通過?begin()/end()?重新獲取迭代器,避免使用舊迭代器。
swap所有迭代器、指針、引用失效(除非交換同一鏈表)交換后,原鏈表的迭代器指向?other?的元素,反之亦然。邏輯上所有迭代器失效(內容所屬鏈表已改變)。交換后通過?begin()/end()?重新獲取迭代器,避免依賴交換后的迭代器。

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

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

相關文章

Laravel Octane 項目加速與靜態資源優化指南

Laravel Octane 項目加速與靜態資源優化指南 一、Octane 核心加速配置 擴展安裝與環境配置 composer require laravel/octane # 安裝核心擴展?php artisan octane:install # 生成配置文件&#xff08;選擇 Swoole/RoadRunner 等服務器&#xff09;?服務器參數調優? …

高露潔牙膏是哪個國家的品牌?高露潔牙膏哪一款最好?

高露潔是來自于美國一個比較有知名度的品牌&#xff0c;在1806年的時候創立。總部是在美國紐約公園大道&#xff0c;在1873年時&#xff0c;高露潔就已經開始銷售罐裝牙膏。 在1896年時期推出可折疊管牙膏&#xff0c;在口腔護理產品發展的過程中擁有著不容忽視的地位。在1992…

【Python爬蟲詳解】第八篇:突破反爬體系的工程實踐

當矛與盾的較量進入白熱化&#xff0c;突破反爬需要的不只是技巧&#xff0c;更是一套完整的工程化解決方案——本文將揭示對抗現代反爬體系的九大核心戰術。 一、JavaScript混淆的深度破解 1. AST&#xff08;抽象語法樹&#xff09;解混淆 案例&#xff1a;某電商平臺商品價…

【Linux調整FTP端口】

Linux調整FTP端口 一、確保新端口未被占用在修改端口之前&#xff0c;可以使用以下命令檢查端口是否被占用&#xff1a; 二、修改vsftpd配置文件1. 打開vsftpd配置文件2. 找到并修改端口配置3. 保存并退出4. 重啟vsftpd服務 三、配置防火墻 在Linux系統中修改FTP端口&#xff0…

npm打包內存不足- JavaScript heap out of memory

直接貼出報錯信息 <--- Last few GCs --->[30904:0000010F60FE58E0] 22090 ms: Scavenge 2037.4 (2069.4) -> 2036.4 (2074.2) MB, 2.5 / 0.0 ms (average mu 0.228, current mu 0.216) allocation failure [30904:0000010F60FE58E0] 22101 ms: Scavenge 2…

AI大語言模型破譯“未知未知”的密鑰:開源情報、被動收入與智能體協作的深層機理與實踐

在人類認識世界的漫長征程中&#xff0c;信息與知識的獲取和運用一直是核心驅動力。我們從“一無所知”的狀態&#xff0c;逐漸積累“已知已知”&#xff0c;并在此基礎上識別“已知未知”&#xff0c;設定目標去探索解答。然而&#xff0c;真正能夠帶來范式轉變、顛覆現有格局…

kubelet 清理資源以緩解磁盤壓力

kubelet 資源清理緩解磁盤壓力指南 在 Kubernetes 集群中&#xff0c;當節點磁盤壓力過大時&#xff0c;可通過以下幾種方式利用 kubelet 清理資源&#xff0c;從而緩解磁盤壓力。 一、鏡像垃圾回收 自動回收 kubelet 內置了鏡像垃圾回收機制&#xff0c;其行為由配置參數控…

SPOJ 11576 TRIP2 - A Famous King’s Trip 【Tarjan+歐拉回路】

自我吐槽 &#xff08;哭 題目傳送門 SPOJ 洛谷 題目大意 讓你在簡單無向圖上刪去2條邊&#xff0c;使該圖聯通并存在歐拉回路 輸出字典序最小的一對邊 思路 考慮到存在歐拉回路的充要條件&#xff0c;即 i n x ≡ 0 ( m o d 2 ) ? i ( 1 ≤ i ≤ n ) in_x\equiv 0 (\m…

藏文情感分析器入門學習實踐

&#x1f3af; 項目目標&#xff1a; 輸入一段藏文短句。自動分析這句話的情感傾向&#xff1a;積極&#xff08;正面&#xff09;/消極&#xff08;負面&#xff09;/中立。 &#x1f50d; 技術原理簡介 情感分析是什么&#xff1f; 情感分析&#xff08;Sentiment Analysi…

雙指針(5)——有效三角形個數

題目&#xff1a; 這道題我們首先可能會想到暴力解法&#xff0c;三個for循環然后進行check&#xff08;&#xff09;。時間復雜度肯定是不允許的。 同時&#xff0c;驗證可以組成三角形的條件是任意兩邊之和大于第三邊&#xff0c;這就意味著我們每組要進行三次比較。但也有捷…

書生實戰營之沐曦專場

一&#xff1a;實驗環境進入和啟動實驗容器(D.run平臺) 1.1首先進入平臺進行注冊 D.run平臺https://console.d.run/ 注冊和登錄環節就跳過了。 1.2 啟動實驗容器--詳細步驟如下 1.2.1選擇容器的名稱、區域、鏡像&#xff08;注意鏡像必須選擇Dlinfer&#xff09; 1.2.2可以選…

內置類型成員變量的初始化詳解

在 C 中&#xff0c;內置類型&#xff08;如 int、float、double、char、指針等&#xff09;的初始化方式與類類型&#xff08;如 std::string、自定義類&#xff09;不同。由于內置類型沒有構造函數&#xff0c;它們的初始化行為由編譯器直接處理。以下是詳細解析&#xff1a;…

對第三方軟件開展安全測評,如何保障其安全使用?

對第三方軟件開展安全測評&#xff0c;能夠精準找出軟件存在的各類安全隱患&#xff0c;進而為軟件的安全使用給予保障。此次會從漏洞發現、風險評估、測試環境等多個方面進行具體說明。 漏洞發現情況 在測評過程中&#xff0c;我們借助專業技術與工具&#xff0c;對第三方軟…

11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文檔

Spring Boot 3.1.5 中使用 SpringDoc OpenAPI&#xff08;替代 Swagger&#xff09;生成 API 文檔 1. 項目結構 假設項目名為 springboot-openapi-demo&#xff0c;以下是項目的基本結構&#xff1a; springboot-openapi-demo/ ├── src/ │ ├── main/ │ │ ├─…

python入門(1)變量與輸入輸出

一、變量 使用規則 變量名值例子 a13變量名規則 變量名可以用大小寫字母、數字、下劃線。 數字、下劃線不可開頭 例子 name name1 1name name_first _first 二、輸入輸出 輸出print print(*objects,sep"",end"\n") objects:多個要輸出的值 sep:每個…

TS 安裝

TS較JS優勢 1 TS靜態類型編程語言。編譯時發現錯誤 2 類型系統 強化變量類型概念 3 支持新語法 4 類型推斷機制 可以和React框架中的各種hook配合 5 任何地方都有代碼提示 tsc 命令 將TS轉為JS 1 tsc 文件.ts 生成 js文件 2 執行JS代碼

Linux-常用監控工具

以下是對 Linux 系統中常用監控工具&#xff08;netstat、ss、dmesg&#xff09;的系統性介紹&#xff0c;涵蓋其核心功能、典型用法及實際應用場景&#xff0c;幫助您分析系統狀態和內核參數調整后的效果&#xff1a; 1. netstat -s&#xff1a;網絡協議棧統計監控 功能 net…

Linux系統:詳解文件描述符與重定向原理以及相關接口(open,read,write,dup2)

本節重點 從狹義與廣義角度理解文件理解文件描述符掌握open,write,read系統調用理解重定向的概念與原理掌握重定向的指令操作stdout與stderr的比較為什么存在stderr&#xff1f; 一、理解“文件” 1.1 狹義角度 在狹義層面&#xff0c;Linux文件是磁盤或存儲設備上連續或分…

美國市場變局:沃爾瑪95%覆蓋率的3個流量入口重構策略

過去幾年&#xff0c;美國零售市場經歷了極大的變化。電商發展迅猛&#xff0c;加上疫情影響&#xff0c;消費者購物習慣出現轉向。而作為美國零售巨頭&#xff0c;沃爾瑪&#xff08;Walmart&#xff09;憑借高達95%的線下覆蓋率&#xff0c;始終是品牌和賣家不可忽視的渠道。…

一文詳解 Linux下的開源打印系統CUPS(Common UNIX Printing System)

文章目錄 前言一、CUPS 簡介二、CUPS 常用指令解析2.1 安裝 CUPS2.2 啟動/重啟服務2.3 添加打印機&#xff08;核心操作&#xff09;2.4 設置默認打印機2.5 打印文件2.6 查看打印任務2.7 取消打印任務2.8 查看、移除已添加的打印機 三、調試與常見問題3.1 日志查看3.2 驅動問題…