C++_STL---list

list的相關介紹

  1. ?list是可以在常數范圍內在任意位置進行插入和刪除的序列式容器,并且該容器可以前后雙向迭代。
  2. ?list的底層是帶頭雙向循環鏈表結構,鏈表中每個元素存儲在互不相關的獨立節點中,在節點中通過指針指向其前一個元素和后一個元素。
  3. ?list與forward_list非常相似:最主要的不同在于forward_list是單鏈表,只能朝前迭代,已讓其更簡單高效。
  4. 與其他的序列式容器相比(array,vector,deque),list通常在任意位置進行插入、移除元素的執行效率更好。
  5. list需要一些額外的空間,以保存每個節點的相關聯信息(對于存儲類型較小元素的大list來說這可能是一個重要的因素)

想要了解更多關于list的詳細內容,請點擊list的文檔介紹。

list的使用

注意:本章只介紹一些常用的接口

list的構造

構造函數接口說明代碼演示
list()構造空的listlist<int> l1;
list(size_t n, const T& val = T())構造的list中包含n個值為val的元素

list<int> l2(5, 100);

// l2中放5個值為100的元素

list(const list<T>& x)拷貝構造函數list<int> l3(l2);
list(InputIterator first, InputIterator last)用[first, last)區間中的元素構造listlist<int> l4(l2.begin(), l2.end());
list(initializer_list<T> li)使用花括號進行構造(C++11)list<int> lt = { 1,2,3,4,5 };

list iterator的使用

list的迭代器,大家在這里可以暫時理解成一個指針,該指針指向list的某個節點。

函數說明接口說明
begin + end返回第一個元素的迭代器+返回最后一個元素下一個位置的迭代器
rbegin + rend返回第一個元素的reverse_iterator,即end位置,返回最后一個元素下一個位置的reverse_iterator,即begin位置
// 迭代器使用舉例
int main()
{list<int> li = {1,2,3,4};list<int>::iterator it = li.begin();while (it != li.end()){cout << *it << " ";++it;}return 0;
}

list的增刪查改

函數聲明接口說明代碼演示
insert在list pos 位置中插入值為val的元素iterator insert(iterator pos, const T& val)
erase刪除list pos 位置的元素iterator erase(iterator pos)
clear清空list的有效元素void clear()

注意:在list的接口里面沒有提供[ ],因為效率不高

list的迭代器失效

相比vector,list的迭代器失效相對簡單一些。

前面說過,此處大家可將迭代器暫時理解成類似于指針,迭代器失效 即迭代器所指向的節點已經不存在了,即該節點被刪除了。因為list的底層結構為帶頭雙向循環鏈表,因此在list中進行插入時是不會導致list的迭代器失效的,只有在刪除時才會失效,并且失效的只是指向被刪除節點的迭代器,其他迭代器不會受到影響。

// 刪除是偶數的數據
list<int> li = {1,2,3,4};
list<int>::iterator it = li.begin();
while (it != li.end())
{if (*it % 2 == 0)//li.erase(it);      會導致迭代器失效it = li.erase(it); //重新對迭代器進行賦值,就會避免失效的問題else++it;
}

注意:此處的迭代器失效只是針對vs下所說,不同平臺的list底層實現結構不同,所以在其他平臺下可能不會失效?

list的底層實現

迭代器的實現

與vector不同,vector的迭代器使用原生態指針就可以搞定,但list不行,因為list的底層結構是不連續的,所以對list的原生態指針進行了封裝。

template<class T, class Ref, class Ptr>
//使用一個類封裝原生態指針
struct listiterator
{typedef ListNode<T> Node;typedef listiterator<T, Ref, Ptr> Self;listiterator(Node* node)  //構造:_node(node){}Self& operator++()        //前置++底層結構{_node = _node->_next;return *this;}Self operator++(int)      //后置++底層結構{Self tmp(*this);_node = _node->_next;return tmp;}Ref operator*()           //operator*底層結構{return _node->_data;}bool operator!=(const Self& it){return _node != it._node;}Node* _node;              //包含一個結點的指針
};

常用接口實現

//拷貝構造
list(const list<T>& x)
{empty_list();             //對list進行初始化for (const auto& e : x){push_back(e);}
}
//賦值
list<T>& operator=(list<T> x) 
{swap(_head,x._head);     //交換兩個list的頭節點return *this;
}
iterator insert(iterator pos, const T& val)
{Node* cur = pos._node;            //獲取指向該結點的指針Node* newnode = new Node(val);Node* prev = cur->_prev;prev->_next = newnode;            //插入newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;return iterator(newnode);
}
iterator erase(iterator pos)
{assert(pos != end());        //斷言,防止刪除頭節點Node* cur = pos._node;       //獲取指向該結點的指針Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = cur->_next;    //刪除next->_prev = prev;delete cur;return iterator(next);
}
void clear()            //清空list的有效數據
{list<T>::iterator it = begin();while (it != end()){it = erase(it); //給迭代器重新賦值,防止迭代器失效}
}

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

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

相關文章

IDEA與通義靈碼的智能編程之旅

1 概述 本文主要介紹在IDEA中如何安裝和使用通義靈碼來助力軟件編程,從而提高編程效率,創造更大的個人同企業價值。 2 安裝通義靈碼 2.1 打開IDEA插件市場 點擊IDEA的設置按鈕,下拉選擇Plugins,如下: 2.2 搜索通義靈碼 在搜索框中輸入“通義靈碼”,如下: 2.3 安…

C語言 二分法求方程根

用二分法求下面方程在&#xff08;-10&#xff0c;10&#xff09;的根。 2x^3-4x^23x-60 這個程序使用二分法求方程 2x^3 - 4x^2 3x - 6 0 在區間 (-10, 10) 內的根。 #include <stdio.h> #include <math.h>// 方程 f(x) double f(double x) {return 2 * pow(x…

使用ifconfig命令獲取當前服務器的內網IP地址

如何使用ifconfig命令獲取當前服務器的內網IP地址呢&#xff1f; ifconfig eth0 | grep inet | awk {print $2}

什么是五級流水?銀行眼中的“好流水”,到底是什么樣的?

無論是按揭買房還是日常貸款&#xff0c;銀行流水都是繞不開的一環。規劃好你的流水&#xff0c;不僅能讓你在申請貸款時更有底氣&#xff0c;還可能幫你省下不少冤枉錢。今天&#xff0c;咱們就來一場深度剖析&#xff0c;聊聊如何在按揭貸款、個人經營抵押貸款前&#xff0c;…

相關向量機(Relevance Vector Machine,RVM)及Python和MATLAB實現

**相關向量機&#xff08;Relevance Vector Machine&#xff0c;RVM&#xff09;** 是一種基于貝葉斯框架的機器學習模型&#xff0c;于2001年由Michael Tipping提出。RVM是一種稀疏建模技術&#xff0c;類似于支持向量機&#xff08;SVM&#xff09;&#xff0c;但其重點在于自…

代碼隨想錄 數組部分+代碼可在本地編譯器運行

代碼隨想錄 數組部分&#xff0c;代碼可在本地編譯器運行 文章目錄 數組理論基礎704.二分查找題目&#xff1a;思路二分法第一種寫法二分法第二種寫法 代碼 27.移除元素題目&#xff1a;思路-雙指針法代碼 977.有序數組的平方題目思路-雙指針代碼 209.長度最小的子數組題目&am…

MPI,0號進程發信息,其他進程收信息

進程0向進程1發送值: 42 進程0向進程2發送值: 42 進程0向進程3發送值: 42 進程0向進程4發送值: 42 進程0向進程5發送值: 42 進程1收到的數據是: 42 進程2收到的數據是: 42 進程3收到的數據是: 42 進程5收到的數據是: 42 進程4收到的數據是: 42 #include <mpi.h> #include…

ChatGPT4深度解析:探索智能對話新境界

大模型chatgpt4分析功能初探 目錄 1、探測目的 2、目標變量分析 3、特征缺失率處理 4、特征描述性分析 5、異常值分析 6、相關性分析 7、高階特征挖掘 1、探測目的 1、分析chat4的數據分析能力&#xff0c;提高部門人效 2、給數據挖掘提供思路 3、原始數據&#xf…

科研繪圖系列:R語言徑向柱狀圖(Radial Bar Chart)

介紹 徑向柱狀圖(Radial Bar Chart),又稱為雷達圖或蜘蛛網圖(Spider Chart),是一種在極坐標系中繪制的柱狀圖。這種圖表的特點是將數據點沿著一個或多個從中心向外延伸的軸來展示,這些軸通常圍繞著一個中心點均勻分布。 特點: 極坐標系統:數據點不是在直角坐標系中展…

王者榮耀游戲復盤

在王者榮耀中&#xff0c;復盤是一個重要的學習和提升過程。根據搜索結果&#xff0c;復盤模板通常包括以下幾個部分&#xff1a; 1. **內容&計劃**&#xff1a; 記錄你在游戲中做了什么&#xff0c;包括具體行動內容&#xff0c;明確原定目標與實際結果的差異。 2. **亮點…

【后端面試題】【中間件】【NoSQL】MongoDB查詢優化3(拆分、嵌入文檔,操作系統)

拆分大文檔 很常見的一種優化手段&#xff0c;在一些特定的業務場景中&#xff0c;會有一些很大的文檔&#xff0c;這些文檔有很多字段&#xff0c;而且有一些特定的字段還特別的大。可以考慮拆分這些文檔 大文檔對MongoDB的性能影響還是很大的&#xff0c;就我個人經驗而言&…

ASCII碼對照表【2024年匯總】

&#x1f37a;ASCII相關文章匯總如下&#x1f37a;&#xff1a; &#x1f388;ASCII碼對照表&#xff08;255個ascii字符匯總&#xff09;&#x1f388;&#x1f388;ASCII碼對照表&#xff08;Unicode 字符集列表&#xff09;&#x1f388;&#x1f388;ASCII碼對照表&#x…

Day05-04-持續集成總結

Day05-04-持續集成總結 1. 持續集成2. 代碼上線目標項目 1. 持續集成 git 基本使用, 拉取代碼,上傳代碼,分支操作,tag標簽 gitlab 用戶 用戶組 項目 , 備份,https,優化. jenkins 工具平臺,運維核心, 自由風格工程,maven風格項目,流水線項目, 流水線(pipeline) mavenpom.xmlta…

【瑞數補環境實戰】某網站Cookie補環境與后綴分析還原

文章目錄 1. 寫在前面2. 特征分析3. 接口分析3. 補JS環境4. 補后綴參數 【&#x1f3e0;作者主頁】&#xff1a;吳秋霖 【&#x1f4bc;作者介紹】&#xff1a;擅長爬蟲與JS加密逆向分析&#xff01;Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走…

二分查找2

1. 山脈數組的峰頂索引&#xff08;852&#xff09; 題目描述&#xff1a; 算法原理&#xff1a; 根據題意我們可以將數組分為兩個部分&#xff0c;一個部分是arr[mid-1]<arr[mid]&#xff0c;另一個部分為arr[mid-1]>arr[mid]&#xff0c;此時不難發現我們可以將二分…

Flink,spark對比

三&#xff1a;az 如何調度Spark、Flink&#xff0c;MR 任務 首先&#xff0c;使用java編寫一個spark任務&#xff0c;定義一個類&#xff0c;它有main方法&#xff0c;里面寫好邏輯&#xff0c;sparkConf 和JavaSparkContext 獲取上下文&#xff0c;然后打成一個jar包&#xf…

數據結構——二叉樹相關題目

1.尋找二叉樹中數值為x的節點 //尋找二叉樹中數值為x的節點 BTNode* TreeFind(BTNode* root, BTDataType x)//傳過來二叉樹的地址和根的地址&#xff0c;以及需要查找的數據 {if (root Null){return Null;}//首先需要先判斷這個樹是否為空&#xff0c;如果為空直接返回空if (…

【JavaWeb程序設計】JSP實現購物車功能

目錄 一、結合之前所學的相關技術&#xff0c;編寫代碼實現以下購物車功能 1. 我實現的功能運行截圖如下 &#xff08;1&#xff09;商品列表頁面home.jsp &#xff08;2&#xff09;登錄賬號頁面/未登錄點擊結賬頁面 &#xff08;3&#xff09;重新登錄頁面&#xff08;記…

昇思25天學習打卡營第18天|ShuffleNet圖像分類

一、簡介&#xff1a; ShuffleNetV1是曠視科技提出的一種計算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一樣主要應用在移動端&#xff0c;所以模型的設計目標就是利用有限的計算資源來達到最好的模型精度。ShuffleNetV1的設計核心是引入了兩種操作&#xff1a;Poin…

如何在centos7安裝Docker

在centOS7中我們可以使用火山引擎鏡像源鏡像安裝Docker,以下是具體的安裝步驟。 step 1: 安裝必要的一些系統工具 sudo yum install -y yum-utils Step 2: 添加軟件源信息 sudo yum-config-manager --add-repo https://mirrors.ivolces.com/docker/linux/centos/docker-ce.r…