list重點接口及模擬實現

list功能介紹

c++中list是使用雙向鏈表實現的一個容器,這個容器可以實現。插入,刪除等的操作。與vector相比,vector適合尾插和尾刪(vector的實現是使用了動態數組的方式。在進行頭刪和頭插的時候后面的數據會進行挪動,時間復炸度為O(N)),但是list更適合在任意位置的插入和刪除。因為在要更改的位置進行節點的指向更改就可以插入數據。

在這里插入圖片描述
在list中插入了6 ,但是的話在空間中沒有改變數據的位置,只是改變了指向。這個時候時間復雜度為常數。

list的總要接口

list構造

在這里插入圖片描述
構造函數(c++11增加了其他的構造函數,在這暫且不講,可自行鏈接查詢 list

默認構造函數

構建一個空鏈表

list (const allocator_type& alloc = allocator_type());

代碼示例:

#include<list>
#include<iostream>list<int> mytest;  //調用默認構造函數

填充構造函數

構造一個具有 n 個元素的鏈表,每個元素的值都是 val。

list (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());

示例:

#include<list>
#include<iostream>list<int> mytest1;  //調用默認構造函數
list<int> mytest2(13,7); //13個元素,每個元素是7

范圍構造器

使用迭代器構造一個list對象

 list (InputIterator first, InputIterator ,const allocator_type& alloc = allocator_type());

示例:

#include<list>
#include<iostream>list<int> mytest1;  //調用默認構造函數
list<int> mytest2(13,7); //13個元素,每個元素是7
list<int> mytest3(mytest2.begin(),mytest2.begin()+5); //使用mytest.2對mytest3進行初始化

拷貝構造函數

list (const list& x);

示例:

#include<list>
#include<iostream>list<int> mytest1;  //調用默認構造函數
list<int> mytest2(13,7); //13個元素,每個元素是7
list<int> mytest3(mytest2.begin(),mytest2.begin()+5); //使用mytest.2對mytest3進行初始化
list<int> mytest4(mytest3);//把mytest3拷貝給mytest4

capacity

函數聲明和接口說明:

empty:檢測list是否為空,如果為空,如果為空返回true,不為空返回false
size:返回對象中數據的個數

element access

函數聲明和接口說明:

front:返回list中第一個元素
back:返回list中最后一個數據

modifiers

函數聲明和接口說明:

push_front:在鏈表第一個位置進行頭插
pop_front:刪除鏈表第一個位置
push_back:在list尾部進行尾插
pop_back:刪除尾部數據
insert:在list pos位置處進行數據插入
erase:刪除list中pos的數據
swap:兩個list對象進行交換
clear: 清空list中有效數據

注意:改文檔只展示了常用list對象,若需要進行更多函數的學習可參考list文檔

list迭代器失效問題

在C++中,list容器是一個雙向鏈表,因此對它的插入和刪除操作不會像vector那樣導致整體內存拷貝,但是list的迭代器在某些操作中仍然會失效。

一、會導致迭代器失效的操作

  1. 刪除元素(erase)

    • 刪除某個元素會使指向該元素的迭代器失效。
    • 其他迭代器仍然有效。
    std::list<int> lst = {1, 2, 3, 4};
    auto it = lst.begin(); // 指向1
    it = lst.erase(it); // it指向被刪除的元素1,失效,需要使用返回值更新it
    // 此時it指向2
    
  2. splice操作中目標位置的迭代器不失效,但被轉移的元素的迭代器可能失效

二、安全的迭代方式

使用返回值來更新迭代器,防止因刪除導致的失效:

for (auto it = lst.begin(); it != lst.end(); ) {if (*it % 2 == 0) {it = lst.erase(it); // 刪除并更新迭代器} else {++it;}
}

三、總結

  • list的插入不會使其他迭代器失效。
  • list的刪除操作會使被刪除元素的迭代器失效。
  • 修改容器結構時,應小心處理返回值,確保不會訪問失效的迭代器。

list的模擬實現

因為list的模擬實現代碼篇幅長度較大,所有在這我展示我list模擬實現的gitee倉庫,大家可進行訪問和探討,歡迎在評論區指出本文檔錯誤

list的模擬實現

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

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

相關文章

CE17.【C++ Cont】練習題組17(堆專題)

目錄 1.P2085 最小函數值 題目 分析 方法1:暴力求解 方法2:二次函數的性質(推薦!) 代碼 提交結果 2.P1631 序列合并 分析 方法1:建兩個堆 第一版代碼 提交結果 第二版代碼 提交結果 第三版代碼 提交結果 方法2:只建一個堆 代碼 提交結果 1.P2085 最小函數值…

題單:表達式求值1

題目描述 給定一個只包含 “加法” 和 “乘法” 的算術表達式&#xff0c;請你編程計算表達式的值。 輸入格式 輸入僅有一行&#xff0c;為需要計算的表達式&#xff0c;表達式中只包含數字、加法運算符 和乘法運算符 *&#xff0c;且沒有括號。 所有參與運算的數字不超過…

DeepSeek超大模型的高效訓練策略

算力挑戰 訓練DeepSeek此類千億乃至萬億級別參數模型,對算力資源提出了極高要求。以DeepSeek-V3為例,其基礎模型參數量為67億,采用專家混合(MoE)架構后實際激活參數可達幾百億。如此規模的模型遠超單張GPU顯存容量極限,必須借助分布式并行才能加載和訓練。具體挑戰主要包…

MFC中DoDataExchange的簡明指南

基本概念 DoDataExchange 是 MFC 框架中實現數據自動同步的核心函數&#xff0c;主要用于對話框中控件與成員變量的雙向綁定。它能讓控件中的數據和成員變量自動保持一致&#xff0c;無需手動讀寫控件數據。 使用示例 1&#xff09;變量聲明 在對話框頭文件中聲明與控件對應…

FreeCAD源碼分析: Transaction實現原理

本文闡述FreeCAD中Transaction的實現原理。 注1&#xff1a;限于研究水平&#xff0c;分析難免不當&#xff0c;歡迎批評指正。 注2&#xff1a;文章內容會不定期更新。 一、概念 Ref. from What is a Transaction? A transaction is a group of operations that have the f…

C++類與對象--1 特性一:封裝

C面向對象三大特性&#xff1a; &#xff08;1&#xff09;封裝&#xff1b;&#xff08;2&#xff09;繼承&#xff1b;&#xff08;3&#xff09;多態&#xff1b; C認為萬物皆是對象&#xff0c;對象上有對應的屬性&#xff08;數據&#xff09;和行為&#xff08;方法&…

初探Reforcement Learning強化學習【QLearning/Sarsa/DQN】

文章目錄 一、Q-learning現實理解&#xff1a;舉例&#xff1a;回顧&#xff1a; 二、Sarsa和Q-learning的區別 三、Deep Q-NetworkDeep Q-Network是如何工作的&#xff1f;前處理&#xff1a;Convolution NetworksExperience Replay 一、Q-learning 是RL中model-free、value-…

WebRTC技術EasyRTC嵌入式音視頻通信SDK打造遠程實時視頻通話監控巡檢解決方案

一、方案概述? 在現代工業生產、基礎設施維護等領域&#xff0c;遠程監控與巡檢工作至關重要。傳統的監控與巡檢方式存在效率低、成本高、實時性差等問題。EasyRTC作為一種先進的實時音視頻通信技術&#xff0c;具備低延遲、高穩定性、跨平臺等特性&#xff0c;能夠有效解決這…

專題四:綜合練習(括號組合算法深度解析)

以leetcode22題為例 題目分析&#xff1a; 給一個數字n&#xff0c;返回合法的所有的括號組合 算法原理分析&#xff1a; 你可以先考慮如何不重不漏的羅列所有的括號組合 清楚什么是有效的括號組合&#xff1f;&#xff1f;&#xff1f; 1.所有的左括號的數量等于右括號的…

星云智控自定義物聯網實時監控模板-為何成為痛點?物聯網設備的多樣化-優雅草卓伊凡

星云智控自定義物聯網實時監控模板-為何成為痛點&#xff1f;物聯網設備的多樣化-優雅草卓伊凡 引言&#xff1a;物聯網監控的模板革命 在萬物互聯的時代&#xff0c;設備監控已成為保障物聯網系統穩定運行的核心環節。傳統的標準化監控方案正面臨著設備類型爆炸式增長帶來的…

5.27本日總結

一、英語 復習list2list29 二、數學 學習14講部分內容 三、408 學習計組1.2內容 四、總結 高數和計網明天結束當前章節&#xff0c;計網內容學完之后主要學習計組和操作系統 五、明日計劃 英語&#xff1a;復習lsit3list28&#xff0c;完成07年第二篇閱讀 數學&#…

幾種運放典型應用電路

運算放大器簡稱:OP、OPA、OPAMP、運放。 一、電壓跟隨器 電壓跟隨器顧名思義運放的輸入端電壓與運放的輸出電壓相等 這個電路一般應用目的是增加電壓驅動能力: 比如說有個3V電源,借一個負載,隨著負載電流變大,3V就會變小說明3V電源帶負載能力小,驅動能力弱,這個時候…

Android核心系統服務:AMS、WMS、PMS 與 system_server 進程解析

1. 引言 在 Android 系統中&#xff0c;ActivityManagerService (AMS)、WindowManagerService (WMS) 和 PackageManagerService (PMS) 是三個最核心的系統服務&#xff0c;它們分別管理著應用的生命周期、窗口顯示和應用包管理。 但你是否知道&#xff0c;這些服務并不是獨立…

從另一個視角理解TCP握手、揮手與可靠傳輸

本文將深入探討 TCP 協議中三次握手、四次揮手的原理&#xff0c;以及其保證可靠傳輸的機制。 一、三次握手&#xff1a;為何是三次&#xff0c;而非兩次&#xff1f; 建立 TCP 連接的過程猶如一場嚴謹的 “對話”&#xff0c;需要經過三次握手才能確保通信雙方的可靠連接。 三…

將Docker compose 部署的夜鶯V6版本升到V7版本的詳細步驟、常見問題解答及相關鏡像下載地址

環境說明 夜鶯官網&#xff1a;首頁 - 快貓星云Flashcat 夜鶯安裝程序下載地址&#xff1a;快貓星云下載中心 夜鶯v7.7.2鏡像&#xff08;X86架構&#xff09;&#xff1a; https://download.csdn.net/download/jjk_02027/90851161 夜鶯ibex v1.2.0鏡像&#xff08;X86架構…

JavaScript【4】數組和其他內置對象(API)

1.數組: 1.概述: js中數組可理解為一個存儲數據的容器,但與java中的數組不太一樣;js中的數組更像java中的集合,因為此集合在創建的時候,不需要定義數組長度,它可以實現動態擴容;js中的數組存儲元素時,可以存儲任意類型的元素,而java中的數組一旦創建后,就只能存儲定義類型的元…

永久免費!專為 Apache Doris 打造的可視化數據管理工具 SelectDB Studio V1.1.0 重磅發布!

作為全球領先的開源實時數據倉庫&#xff0c; Apache Doris Github Stars 已超過 13.6k&#xff0c;并在 5000 余家中大型企業生產環境得到廣泛應用&#xff0c;支撐業務核心場景&#xff0c;成為眾多企業數據分析基礎設施不可或缺的重要基座。過去&#xff0c;Apache Doris 用…

數字萬用表與指針萬用表使用方法及注意事項

在電子測量領域&#xff0c;萬用表是極為常用的工具&#xff0c;數字萬用表和指針萬用表各具特點。熟練掌握它們的使用方法與注意事項&#xff0c;能確保測量的準確性與安全性。下面為您詳細介紹&#xff1a; 一 、數字萬用表按鈕功能 > 進入及退出手動量程模式 每 按 […

深度學習Dropout實現

深度學習中的 Dropout 技術在代碼層面上的實現通常非常直接。其核心思想是在訓練過程中&#xff0c;對于網絡中的每個神經元&#xff08;或者更精確地說&#xff0c;是每個神經元的輸出&#xff09;&#xff0c;以一定的概率 p 隨機將其輸出置為 0。在反向傳播時&#xff0c;這…

AtCoder AT_abc406_c [ABC406C] ~

前言 除了 A 題&#xff0c;唯一一道一遍過的題。 題目大意 我們定義滿足以下所有條件的一個長度為 N N N 的序列 A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\dots,A_N) A(A1?,A2?,…,AN?) 為波浪序列&#xff1a; N ≥ 4 N\ge4 N≥4&#xff08;其實滿足后面就必須滿足這…