C++第二十三彈---深入理解STL中list的使用

?個人主頁:?熬夜學編程的小林

💗系列專欄:?【C語言詳解】?【數據結構詳解】【C++詳解】

目錄

1、list的介紹

2、list的使用

2.1、構造函數

2.2、賦值操作符重載

2.3、迭代器使用

2.4、容量操作

2.5、元素訪問

2.6、修改操作

2.7、其他操作

總結


1、list的介紹

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

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

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

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

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

因此list的本質就是雙向循環鏈表。

2、list的使用

2.1、構造函數

1. Default constructor (構造一個沒有元素的空容器。)

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

2. Fill constructor? (構造了一個含有 n 個元素的容器,每個元素都是 val 的副本。?)

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

3.?Range constructor (使用兩個迭代器 first 和 last,這兩個迭代器指定了一個序列的范圍,來構造一個容器。這個范圍包括從 first 到 last 之間的所有元素,但不包括 last 指向的元素。)

template <class InputIterator>  
list (InputIterator first, InputIterator last,const allocator_type& alloc =allocator_type());

4. Copy constructor (構造一個容器,其中包含 x 中每個元素的副本,順序相同。)

list (const list& x);
構造函數( (constructor))接口說明
list (size_type n, const value_type& val = value_type())構造的list中包含n個值為val的元素
list()構造空的list
list (const list& x)拷貝構造函數
list (InputIterator first, InputIterator last)用[first, last)區間中的元素構造list

代碼演示:

//構造函數
void test_list1()
{//1.默認構造list<int> lt1;//2.填充構造list<int> lt2(10, 1);//3.范圍構造(迭代器區間構造)vector<int> v = { 1,3,5,6,7,8,9 };list<int> lt3(v.begin(), v.end());//4.拷貝構造list<int> lt4(lt3);}

我們可以通過打斷點的方式查看 list 中元素。
測試結果:

2.2、賦值操作符重載

1. copy (將新內容分配給容器,替換其當前內容,并相應地修改其大小。??)

list& operator= (const list& x);

代碼演示:

void test_list2()
{list<int> lt1(10, 1);list<int> lt2 = lt1;
}

?測試結果:

2.3、迭代器使用

函數聲明接口說明
begin +
end
返回第一個元素的迭代器+返回最后一個元素下一個位置的迭代器
rbegin +
rend
返回第一個元素的reverse_iterator,即end位置,返回最后一個元素下一個位置的
reverse_iterator,即begin位置

此處迭代器指向的位置與vector容器一樣,直接演示代碼!!!

代碼演示:

void test_list3()
{vector<int> v = { 1,2,3,4,5,6,7,8,9 };list<int> lt(v.begin(), v.end());//迭代器區間構造list<int>::iterator it = lt.begin();//獲取指向第一個元素迭代器while (it != lt.end())//正向打印鏈表{cout << *it << " ";//解引用當前位置的值,類似指針解引用it++;//it向后走}cout << endl;auto rit = lt.rbegin();//類型可以直接還用autowhile (rit != lt.rend())//反向打印鏈表{cout << *rit << " ";rit++;}cout << endl;
}

測試結果:?

?

2.4、容量操作

  • empty (判斷容器是否為空。)
  • size (獲取容器元素個數。)

代碼演示:

void test_list4()
{vector<int> v{ 1,3,5,7,9 };list<int> lt(v.begin(), v.end());cout << "size() = " << lt.size() << endl;cout << "empty() = " << lt.empty() << endl;
}

測試結果:?

【注意】
1. begin與end為正向迭代器,對迭代器執行++操作,迭代器向后移動
2. rbegin(end)與rend(begin)為反向迭代器,對迭代器執行++操作,迭代器向前移動
?

2.5、元素訪問

  • front (獲取第一個元素。?)
  • back (獲取最后一個元素。)?

代碼演示:

void test_list5()
{vector<int> v{ 2,4,6,8,10 };list<int> lt(v.begin(), v.end());cout << "front() = " << lt.front() << endl;cout << "back() = " << lt.back() << endl;
}

測試結果:?

2.6、修改操作

函數聲明接口說明
push_front在list首元素前插入值為val的元素
pop_front刪除list中第一個元素
push_back在list尾部插入值為val的元素
pop_back刪除list中最后一個元素


?

  • push_back (在末尾添加元素。) :
  • pop_back? ?(刪除最后一個元素。) :?

代碼演示:

void test_list6()
{list<int> lt;lt.push_back(1);//尾插lt.push_back(2);lt.push_back(3);lt.push_front(10);//頭插lt.push_front(20);lt.push_front(30);
}

測試結果:?

  • push_front?(在開頭添加元素。)
  • pop_front? ?(刪除第一個元素。)

代碼演示:

void test_list7()
{list<int> lt = { 1,2,3,4,5,6,7 };for (auto x : lt){cout << x << " ";}cout << endl;lt.pop_back();//尾刪lt.pop_front();//頭刪for (auto x : lt){cout << x << " ";}
}

測試結果:?

  • insert? ?? ? ? ?(在pos位置前插入元素。)
  • erase?? ? ? ? ?(刪除pos位置元素。)?

代碼演示:

void test_list8()
{list<int> lt = { 1,2,3,4,5 };//iterator insert(iterator pos, const T& val);//在pos位置前插入vallt.insert(lt.begin(), 100);//在第一個位置前插入100for (auto x : lt){cout << x << " ";}cout << endl;//iterator erase (iterator pos);//刪除pos位置的值lt.erase(lt.begin());//刪除第一個位置的值for (auto x : lt){cout << x << " ";}cout << endl;
}

測試結果:?

2.7、其他操作

splice?

轉移鏈表元素到另一個鏈表。

代碼演示:

void test_list9()
{list<int> lt;list<int> lt1(1,10);lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto x : lt1){cout << x << " ";}cout << endl;//將lt鏈表的元素轉移到lt1的第一個位置,轉移的是結點lt1.splice(lt1.begin(), lt);for (auto x : lt1){cout << x << " ";}cout << endl;//lt鏈表的元素全部轉移到lt1中,因此打印為空for (auto x : lt){cout << x << " ";}cout << endl;
}

測試結果:?

remove()

刪除等于val值的元素。

unique()

從容器中每個連續的相等元素組中刪除除第一個元素之外的所有元素。

代碼演示:

void test_list10()
{list<int> lt = { 1,2,3,4,5 };for (auto x : lt){cout << x << " ";}cout << endl;lt.remove(1);//刪除等于1的所有元素for (auto x : lt){cout << x << " ";}cout << endl;//從容器中每個連續的相等元素組中刪除除第一個元素之外的所有元素。lt.unique();for (auto x : lt){cout << x << " ";}cout << endl;
}

?測試結果:

sort()

對列表的元素進行排序,可以接受一個比較函數。

代碼演示:

bool Com(int x, int y)
{return x > y;//降序
}void test_list11()
{list<int> lt = { 1,2,3,3,8,9 };for (auto x : lt){cout << x << " ";}cout << endl;lt.sort(Com);//使用Com排序方法排序,降序for (auto x : lt){cout << x << " ";}cout << endl;
}

?測試結果:

?

reverse()

將鏈表元素進行逆序。

代碼演示:

void test_list12()
{list<int> lt = { 1,2,3,3,8,9 };for (auto x : lt){cout << x << " ";}cout << endl;lt.reverse();//將鏈表逆序for (auto x : lt){cout << x << " ";}cout << endl;
}

測試結果:

總結


本篇博客就結束啦,謝謝大家的觀看,如果公主少年們有好的建議可以留言喔,謝謝大家啦!

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

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

相關文章

從0開始學人工智能測試節選:Spark -- 結構化數據領域中測試人員的萬金油技術(三)

分布式計算原理 分布式計算的原理總結一句話就是&#xff1a;分而治之。 把數據分片&#xff0c;存在不同的機器中&#xff0c;解決數據存儲的壓力。客戶端和服務端之間通過相關協議來自動的完成在不同的機器之間進行數據的存取&#xff0c;用戶并不感知數據的物理存儲結構。 用…

UIKit之App界面Demo

需求 實現簡單的APP界面 功能&#xff1a; 實現滾動實現上層、下層橫欄滾動時穿透效果&#xff08;永遠浮在表面&#xff0c;不跟著滾動&#xff09;。暫用UIView代替&#xff0c;還沒學Bar。 分析&#xff1a; 知識點&#xff1a; 實現鼠標拖動的上下滾動&#xff1a;當…

小紅書前端2輪面試期望22K,全程問低代碼設計

一面&#xff08;通過&#xff09; 1、好&#xff0c;那我們開始把&#xff0c;先簡單介紹一下自己的一個經歷&#xff0c;以及自己有亮點的項目&#xff1f;balabala 2、你可以這樣介紹&#xff1a;在這里邊主要負責哪幾個項目&#xff0c;哪些項目是比較有亮點的&#xff0…

python用PyPDF2函數庫方法對pdf文件切割

煩透了那些軟件動不動就要收費&#xff0c;于是自己嘗試碼程序處理pdf分割。 由于PyPDF2更新到了3.0之后&#xff0c;之前網上的舊代碼無法使用&#xff0c;查了半天沒出準譜&#xff0c;結果百度AI生成了代碼&#xff0c;一試&#xff0c;成了&#xff01; 果然&#xff0c;…

代碼隨想錄-算法訓練營day60【單調棧03:柱狀圖中最大的矩形】

代碼隨想錄-035期-算法訓練營【博客筆記匯總表】-CSDN博客 第十章 單調棧part03有了之前單調棧的鋪墊,這道題目就不難了。 ● 84.柱狀圖中最大的矩形https://programmercarl.com/0084.%E6%9F%B1%E7%8A%B6%E5%9B%BE%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2.htm…

智享直播(三代)2024年:打造24/7實景無人直播,引領年輕資產創業新紀元!

在21世紀的數字化浪潮中&#xff0c;直播行業以其獨特的魅力和無限的可能性&#xff0c;正在全球范圍內掀起一場前所未有的( keJ0277 )創業革命。而在這場革命中&#xff0c;智享直播&#xff08;三代&#xff09;以其創新的技術理念和前瞻的戰略布局&#xff0c;立志于2024年打…

怎么用電腦錄制視頻?小白也能快速上手

隨著網絡技術的發展&#xff0c;電腦錄制視頻已經成為了許多人的日常需求&#xff0c;無論是游戲玩家想錄制自己的精彩操作&#xff0c;還是上班族需要錄制屏幕演示&#xff0c;一款好用的錄屏軟件變得尤為重要。可是你知道怎么用電腦錄制視頻嗎&#xff1f;本文將介紹兩種電腦…

I2C通信協議

I2C通信協議 項目要求是&#xff0c;通過通信線&#xff0c;是實現單片機讀寫外掛模塊寄存器的功能&#xff0c;至少實現&#xff0c;在指定位置寫寄存器和在指定位置讀寄存器&#xff0c;實現了讀寫寄存器&#xff0c;就實現對模塊的控制。 MPU6050&#xff0c;OLED&#xf…

【ARM】Fusa Compiler 6.16 LTS的安全認證報告獲取

【更多軟件使用問題請點擊億道電子官方網站】 1、 文檔目標 了解ARM的Arm Compiler for Embedded FuSa 6.16 LTS的安全認證證書和報告的獲取 2、 問題場景 對于使用了ARM DS Gold/Platinum、MDK pro或者Arm Compiler for Embedded FuSa 6.16 LTS產品的客戶。在對于最終的產品…

生產問題排查:springboot項目啟動時注冊nacos失敗或運行時從nacos閃退

文章目錄 一、引出問題二、解決方案1、使用actuator健康檢查2、項目啟動時判斷nacos是否正常連接3、k8s設置探針 一、引出問題 生產項目是用k8s部署的&#xff0c;最近經常遇到啟動時注冊不到nacos&#xff08;查找nacos的host地址找不到&#xff09;&#xff0c;或者運行的好…

有文字轉語音真人發聲嗎?這5個配音工具堪比真人配音

青春是一首永不老去的歌&#xff0c;它鐫刻在生命的唱片上&#xff0c;永不退色。 每當我們聽到那些熟悉的旋律&#xff0c;心中總會涌起一股暖流&#xff0c;仿佛回到了那個充滿活力和夢想的年代。借助現代科技的力量&#xff0c;我們可以通過文字轉語音軟件&#xff0c;讓這…

.NET集成DeveloperSharp實現圖片的裁剪、縮放、與加水印

&#x1f3c6;作者&#xff1a;科技、互聯網行業優質創作者 &#x1f3c6;專注領域&#xff1a;.Net技術、軟件架構、人工智能、數字化轉型、DeveloperSharp、微服務、工業互聯網、智能制造 &#x1f3c6;歡迎關注我&#xff08;Net數字智慧化基地&#xff09;&#xff0c;里面…

Apache Doris 基礎 -- 數據表設計(表索引)

1、索引概述 索引用于幫助快速過濾或搜索數據。目前&#xff0c;Doris支持兩種類型的索引:內置智能索引和用戶創建的二級索引。 內置智能索引 排序鍵和前綴索引:Apache Doris基于排序鍵以有序的方式存儲數據。它為每1024行數據創建一個前綴索引。索引中的鍵是當前1024行組的…

github搭建個人博客

準備工作 windows安裝nodejs windows安裝git windows安裝hexo 擁有gitee個人賬戶 配置信息 通過gitee創建博客倉庫 登錄gitee平臺&#xff0c;進入主界面&#xff0c;右側加號&#xff0c;新建倉庫&#xff0c;注意&#xff1a;倉庫名稱和gitee用戶名稱一致 生成/添加 SSH 公…

初級網絡工程師之入門到入獄(一)

本文是我在學習過程中記錄學習的點點滴滴&#xff0c;目的是為了學完之后鞏固一下順便也和大家分享一下&#xff0c;日后忘記了也可以方便快速的復習。 網絡工程師從入門到入獄 前言一、交換機二、路由器三、DHCP&#xff08;動態主機配置協議&#xff09;四、路由器配置 DHCP自…

【golang】go語言讀取Excel表格中的數據

導入庫基本用法封裝 在Go語言中&#xff0c;可以使用第三方庫來讀取Excel文件。 常用的庫是github.com/tealeg/xlsx&#xff0c;提供了處理Excel文件的功能。 導入庫 首先&#xff0c;安裝"github.com/tealeg/xlsx"庫。可以通過以下命令在終端中安裝&#xff1a; g…

Transformer系列:Greedy Search貪婪搜索解碼流程原理解析

解碼器預測流程簡述 Encoder-Decoder這類框架需要在解碼器中分別拿到前文已經翻譯的輸入&#xff0c;以及編碼器的輸出這兩個輸入&#xff0c;一起預測出下一個翻譯的單詞。在訓練階段&#xff0c;一個句子通過右移一位的方式轉化為從第二個詞到最后一個詞的逐位預測任務&…

Springboot vue elementui 前后端分離 事故災害案例管理系統

源碼鏈接 系統演示:https://pan.baidu.com/s/1hZQ25cpI-B4keFsZdlzimg?pwdgw48

【Golang】go語言寫入數據并保存Excel表格

導入包創建文件添加表格添加行添加單元格保存文件封裝 導入包 首先&#xff0c;安裝github.com/tealeg/xlsx庫。可以通過以下命令在終端中安裝&#xff1a; go get github.com/tealeg/xlsx創建文件 指定好文件的名字 fileName : "D:\\a.xlsx"再判斷文件是否存在&…

Java集合概述

分類 分為兩大類&#xff1a;Collection接口類和Map接口類 這兩個接口都繼承自一個共同的接口&#xff1a;Iterable接口&#xff0c;意為可迭代的 Iterable接口當中有一個Iterator迭代器接口對象&#xff0c;作為接口的變量&#xff08;public static final修飾&#xff09;…