【C++干貨鋪】list的使用 | 模擬實現

=========================================================================

個人主頁點擊直達:小白不是程序媛

C++專欄:C++干貨鋪

代碼倉庫:Gitee

=========================================================================

目錄

list的介紹及使用

list的介紹

list的使用

list的構造

list迭代器的使用

list的增刪查改

list的模擬實現

結點的封裝

迭代器的封裝

list成員變量

構造函數

拷貝構造函數

operator=

析構函數和清理空間

insert

erase

push_back、push_front、pop_back、pop_front

begin+end、cbegin+cend

list和vector的對比


list的介紹及使用

list的介紹

1. list是可以在常數范圍內在任意位置進行插入和刪除的序列式容器,并且該容器可以前后雙向迭代。

2. list的底層是雙向鏈表結構,雙向鏈表中每個元素存儲在互不相關的獨立節點中,在節點中通過指針指向其前一個元素和后一個元素。

3. list與forward_list非常相似:最主要的不同在于forward_list是單鏈表,只能朝前迭代,已讓其更簡單高效。

4. 與其他的序列式容器相比(array,vector,deque),list通常在任意位置進行插入、移除元素的執行效率更好。

5. 與其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的隨機訪問,比如:要訪問list的第6個元素,必須從已知的位置(比如頭部或者尾部)迭代到該位置,在這段位置上迭代需要線性的時間開銷;list還需要一些額外的空間,以保存每個節點的相關聯信息(對于存儲類型較小元素的大list來說這可能是一個重要的因素)

list的使用

list的構造

函數名稱? ? ? ?函數作用
list(size_t type n,const value_type構造的list中包含n個值為val的元素
list()構造空list
list(const list&x)拷貝構造函數
list(first,last)迭代器區間中的元素構造list
	list<int> lt1(10, 1);list<int> lt2;list<int> lt3(lt1);list<int> lt4(lt3.begin(), lt3.end());list<int>::iterator lt = lt4.begin();while (lt != lt4.end()){cout << *lt << " ";lt++;}cout << endl;for (auto e : lt4){cout << e << " ";}cout << endl;

list迭代器的使用

函數名稱函數作用
begin+end返回第一個元素的迭代器+返回最后一個元素下一個位置的迭代器
rbegin+rend返回第一個元素的reverse_iterator,即end位置,返回最后一個元素下一個位置的
reverse_iterator,即begin位置

list的增刪查改

函數名稱函數作用
push_back在list尾部插入值為val的元素
push_front在list首元素前插入值為val的元素
pop_back刪除list中最后一個元素
pop_front刪除list中第一個元素
insert在list position 位置中插入值為val的元素
erase刪除list position位置的元素
	list<int> lt(5,9);//頭插lt.push_front(1);//尾插lt.push_back(2);for (auto e : lt){cout << e << " ";}cout << endl;//尾刪lt.pop_back();//頭刪lt.pop_front();for (auto e : lt){cout << e << " ";}cout << endl;lt.insert(lt.begin(), 30);for (auto e : lt){cout << e << " ";}cout << endl;lt.erase(lt.begin());for (auto e : lt){cout << e << " ";}

?


list的模擬實現

list通過一個一個結構體的結點實現,節點中包括指向下一個位置、指向前一個位置的指針和有效數值組成。

結點的封裝

使用struct而不是class是因為默認為公開的

	template<class T>//封裝結點struct list_node{list_node(const T& x=T()):_data(x),_next(nullptr),_prev(nullptr){}T _data;list_node* _next;list_node* _prev;};

迭代器的封裝

list和順序表最大的不同是list物理上不連續,需要使用指針進行移動直線下一個或者指向其他的操作,而不像順序表物理上是連續的,++、--都可以拿到有效數據;因此需要對迭代器單獨封裝。

//迭代器封裝template<class T, class Ref, class Ptr>struct __list_iterator{typedef list_node<T> Node;typedef __list_iterator<T, Ref, Ptr> self;Node* _node;__list_iterator(Node* node):_node(node){}self& operator++(){_node = _node->_next;return *this;}self& operator--(){_node = _node->_prev;return *this;}self operator++(int){self tmp(*this);_node = _node->_next;return tmp;}self operator--(int){self tmp(*this);_node = _node->_prev;return tmp;}Ref operator*(){return _node->_data;}Ptr operator->(){return &_node->_data;}bool operator!=(const self& s){return _node != s._node;}bool operator==(const self& s){return _node == s._node;}};

list成員變量

指向結構體節點的指針和有效數據的個數

		Node* _node;size_t _size;

構造函數

		typedef list_node<T> Node;public:typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;void empty_init(){_node = new Node;_node->_next = _node;_node->_prev = _node;_size = 0;}list(){empty_init();}

拷貝構造函數

	list(list<T>& x){empty_init();for (auto e : x){push_back(e);}}

operator=

		void swap(list<T>& lt){std::swap(_node, lt._node);std::swap(_size, lt._size);}list<int>& operator=(list<int> lt){swap(lt);return *this;}

析構函數和清理空間

		~list(){clear();delete _node;_node = nullptr;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}

insert

		void insert(iterator pos, const T& x){Node* cur = pos._node;Node* newnode = new Node(x);Node* prev = cur->_prev;prev->_next = newnode;newnode->_next = cur;cur->_prev = newnode;newnode->_prev = prev;_size++;}

erase

iterator erase(iterator pos){Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;return next;}

push_back、push_front、pop_back、pop_front

		void push_back(const T& x){insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void pop_front(){erase(begin());}void pop_back(){erase(--end());}

begin+end、cbegin+cend

		const_iterator begin() const{return const_iterator(_node->_next);}const_iterator end() const{return const_iterator(_node);}iterator end(){return _node;}iterator begin(){return _node->_next;}

list和vector的對比

vectorlist



動態順序表,一段連續空間帶頭結點的雙向循環鏈表



支持隨機訪問,訪問某個元素效率O(1)不支持隨機訪問,訪問某個元素
效率O(N)




任意位置插入和刪除效率低,需要搬移元素,時間復雜
度為O(N),插入時有可能需要增容,增容:開辟新空
間,拷貝元素,釋放舊空間,導致效率更低
任意位置插入和刪除效率高,不
需要搬移元素,時間復雜度為
O(1)




底層為連續空間,不容易造成內存碎片,空間利用率
高,緩存利用率高
底層節點動態開辟,小節點容易
造成內存碎片,空間利用率低,
緩存利用率低


原生態指針對原生態指針(節點指針)進行封裝




在插入元素時,要給所有的迭代器重新賦值,因為插入
元素有可能會導致重新擴容,致使原來迭代器失效,刪
除時,當前迭代器需要重新賦值否則會失效
插入元素不會導致迭代器失效,
刪除元素時,只會導致當前迭代
器失效,其他迭代器不受影響
使


需要高效存儲,支持隨機訪問,不關心插入刪除效率大量插入和刪除操作,不關心隨
機訪問

今天對list的介紹和底層模擬實現的分享到這就結束了,希望大家讀完后有很大的收獲,也可以在評論區點評文章中的內容和分享自己的看法。您三連的支持就是我前進的動力,感謝大家的支持!!?!

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

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

相關文章

【大數據Hive】hive 優化策略之job任務優化

目錄 一、前言 二、hive執行計劃 2.1 hive explain簡介 2.1.1 語法格式 2.1.2 查詢計劃階段說明 2.2 操作演示 2.2.1 不加條件的查詢計劃分析 2.2.2 帶條件的查詢計劃分析 三、MapReduce屬性優化 3.1 本地模式 3.1.1 本地模式參數設置 3.1.2 本地模式操作演示 3.2 …

每日一題:LeetCode-589.N叉樹的前序遍歷

每日一題系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

package.json 依賴版本中的符號含義

依賴包的版本問題 實例說明~1.2.3主版本次要版本補丁版本;1.2.3 < version < 1.3.0;~1.2主版本次要版本;1.2.0 < version < 1.3.0~1主版本;1.0.0 < version < 2.0.0 符號實例版本范圍說明1.0.01.0.0鎖定1.0.0版本&#xff0c;必須這個版本。^會匹配最新的大…

7種SQL的進階用法

1.自定義排序&#xff08;ORDER BY FIELD&#xff09; 在MySQL中ORDER BY排序除了可以用ASC和DESC之外&#xff0c;還可以使用自定義排序方式來實現。 CREATE TABLE movies ( id INT PRIMARY KEY AUTO_INCREMENT, movie_name VARCHAR(255), actors VARCHAR(255), price DEC…

基于鵜鶘算法優化概率神經網絡PNN的分類預測 - 附代碼

基于鵜鶘算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于鵜鶘算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于鵜鶘優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神經網絡的光滑…

基于向量加權平均算法優化概率神經網絡PNN的分類預測 - 附代碼

基于向量加權平均算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于向量加權平均算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于向量加權平均優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xf…

win10系統中,任務欄卡住,鼠標移動到任務欄轉圈加載中

原因&#xff1a; 1.系統更新導致的問題 2.任務欄的“資訊與興趣導致” 解決&#xff1a; 方法一&#xff1a;重新啟動資源管理器任務 1.快捷鍵調出任務管理器&#xff1a;ctrlshiftesc,或ctrlaltdel 1.1.找到“windows資源管理器&#xff0c;鼠標右鍵&#xff0c;選擇重…

邊云協同架構設計

文章目錄 一. "邊云協同"是什么&#xff1f;二. "邊云協同"主要包括6種協同2.1 資源協同2.2 數據協同2.3 智能協同2.4 應用管理協同2.5 業務管理協同2.6 服務協同 三. "邊云協同"的優勢 其它相關推薦&#xff1a; 系統架構之微服務架構 系統架構…

python文本

文本 除了數字 Python 還可以操作文本&#xff08;由 str 類型表示&#xff0c;稱為“字符串”&#xff09;。 這包括字符 "!", 單詞 "rabbit", 名稱 "Paris", 句子 "Got your back." 等等. "Yay! :)"。 它們可以用成對的單…

【JS】Chapter15-高階技巧

站在巨人的肩膀上 黑馬程序員前端JavaScript入門到精通全套視頻教程&#xff0c;javascript核心進階ES6語法、API、js高級等基礎知識和實戰教程 &#xff08;十五&#xff09;高階技巧 1. 深淺拷貝 開發中我們經常需要復制一個對象。如果直接用賦值會有下面問題&#xff1a;/…

微信訂房功能怎么做_公眾號里怎么實現在線訂房系統

微信公眾號在線訂房系統&#xff1a;一鍵解決您的住宿問題 在當今數字化時代&#xff0c;微信公眾號已經成為人們生活中不可或缺的一部分。它提供了各種各樣的功能和服務&#xff0c;讓我們的生活變得更加便捷和高效。而如今&#xff0c;微信公眾號也實現了在線訂房功能&#…

什么是應急演練腳本?其設計原則是什么?

應急演練腳本是一種系統性、有計劃的模擬性文件&#xff0c;旨在測試和評估組織在緊急情況下的應對能力。這種腳本提供了一系列步驟和場景&#xff0c;以確保團隊能夠高效、協調地應對各種緊急事件。以下將詳細探討應急演練腳本的定義、設計原則以及實施過程。 一、應急演練腳本…

常見面試題-Redis持久化策略

談談Redis 的持久化策略&#xff1f; 參考文章&#xff1a; Redis 持久化機制演進與百度智能云的實踐 Redis的確是將數據存儲在內存的&#xff0c;但是也會有相關的持久化機制將內存持久化備份到磁盤&#xff0c;以便于重啟時數據能夠重新恢復到內存中&#xff0c;避免數據丟…

【Python 千題 —— 基礎篇】奇數列表

題目描述 題目描述 創建奇數列表。使用 for 循環創建一個包含 20 以內奇數的列表。 輸入描述 無輸入。 輸出描述 輸出創建的列表。 示例 示例 ① 輸出&#xff1a; 創建的奇數列表為: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]代碼講解 下面是本題的代碼&#xff1a; #…

9. 回文數 --力扣 --JAVA

題目 給你一個整數 x &#xff0c;如果 x 是一個回文整數&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 回文數是指正序&#xff08;從左向右&#xff09;和倒序&#xff08;從右向左&#xff09;讀都是一樣的整數。 例如&#xff0c;121 是回文&#xff0…

二、爬蟲-爬取肯德基在北京的店鋪地址

1、算法框架解釋 針對這個案例&#xff0c;現在對爬蟲的基礎使用做總結如下&#xff1a; 1、算法框架 (1)設定傳入參數 ~url: 當前整個頁面的url:當前頁面的網址 當前頁面某個局部的url:打開檢查 ~data:需要爬取數據的關鍵字&…

DB2中實現數據字段的拼接(LISTAGG() 與 xml2clob、xmlagg)

DB2中實現數據字段拼接&#xff08;LISTAGG 與 xml2clob、xmlagg&#xff09; 1. 使用函數LISTAGG()1.1 同oracle實現方式1.2 DB2中使用LISTAGG()1.2.1 關于DB2版本1.2.2 數據準備1.2.3 代碼實現 2 解決DB2中關于 LISTAGG() 超長問題2.1 使用xmlagg xmlelement2.2 將xml標簽去…

數據結構與算法編程題11

已知兩個鏈表A和B分別表示兩個集合&#xff0c;其元素遞增排列。 請設計算法求出A與B的交集&#xff0c;并存放于A鏈表中。 a: 1, 2, 2, 4, 5, 7, 8, 9, 10 b: 1, 2, 3, 6, 7, 8 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #defin…

【iOS】實現評論區展開效果

文章目錄 前言實現行高自適應實現評論展開效果解決cell中的buttom的復用問題 前言 在知乎日報的評論區中&#xff0c;用到了Masonry行高自適應來實現評論的展開&#xff0c;這里設計許多控件的約束問題&#xff0c;當時困擾了筆者許久&#xff0c;特此撰寫博客記錄 實現行高自…

如何構建更簡潔的前端架構?

目錄 為什么需要前端架構&#xff1f; 那么&#xff0c;前端架構是什么樣的呢&#xff1f; 使用了哪些層&#xff1f; 那么&#xff0c;這種架構會出什么問題呢&#xff1f; 我們應該如何避免這些錯誤&#xff1f; 哪些原則應適用于組件&#xff1f; Anti-Patterns 反模…