C++中STL六大組件List的簡單介紹

一、前言

? ? ? ? C++非常重視效率,對效率有損失的代碼常常是能省則省。使用list要包含的頭文件是<list>,要包含頭文件就是#iinclude <list>,List肯定是一種鏈表,我們不妨回憶一下那種鏈表插入刪除效率最快也就是最簡單,還能減少判斷次數,鏈表的結尾是否要判斷nullptr。毫無疑問,list所使用的結構是帶頭雙向環形鏈表。帶頭意味著插入形式單一,無論鏈表中是否存在數據,都只需要將新結點的上一個指針和下一個指針做處理,省去判斷是否存在結點,而且寫起來也非常簡單。雙向意味著只要知道鏈結點的位置就可以訪問它的下一個位置或是上一個位置,插入刪除都十分方便,如果是單向還要一個一個的遍歷查找。環形鏈表就更加簡單了,學過雙向鏈表、單(向)鏈表的同學都知道,不管是單鏈表還是雙向鏈表尾插都十分不便,如果有固定的尾插地址維護起來更是難上加難,但是雙向(可以往后也可以往前)環形鏈表根本就沒有這樣的顧慮,因為可以從開頭往后走到達尾插位置。形狀大概就像土家族的吊腳樓。

二、list的詳細介紹

? ? ? ? 在STL容器中,我們只要會其中的一個容器的接口,我們就可以觸類旁通。不用抱太多疑慮。

? ? ? ? 和大多數STL容器一樣。包含的頭文件還是它的本名<list>

? ? ? ? 包含就要做#include <list>,不想加每次聲明list對象和迭代器都加std::在對象之前的話#include <list>? ? ? ? using namespace std;也是可以的。

? ? ? ? 2.1? ? ? ? size()函數和empty()函數

? ? ? ? 注意該容器不是和Vector和String一樣的數組存儲。而是通過一個特質的結構體對象進行鏈接。(小編盡量快點出一個關于指針和結構體指針的專題。)連接的結點地址不一定要像數組一樣連續,,所以list沒有像Vector和String有容量capacity這個概念,地址分布可以盡量松散一些,可以不用申請那么大塊空間,更好申請。size()函數就是反映list中的數據有多少。empty()反映list是否為空。

// 形如這樣的結點進行鏈接。
// 這里是隨便寫的,list的結點肯定不長這樣。比這要復雜。
struct List_Node
{// 要存儲的內容。// 有模板的話,什么類型都可以。int _val;// 上一個結點的地址。struct List_Node* _prev;// 下一個結點的地址。struct List_Node* _next;
};#include <iostream>
#include <list>int main()
{std::list<int> lt;for (int i = 0; i <= 13; ++i){lt.push_back(i);lt.push_back(i);std::cout << "當i為   " << i << "     時list中的數據總量:      " << lt.size() << std::endl;}return 0;
}

????????2.2? ? ? ? insert()函數和erase()函數

? ? ? ? 通過Vector和String的學習,我們知道insert()函數和erase()函數都是在指定位置插入刪除,同時用到的都是與指針有著相似作用的迭代器。下面話不多說,直接開始上示例。

#include <iostream>
#include <list>int main()
{std::list<int> lt;for (int i = 0; i <= 13; ++i){// 頭插lt.insert(lt.begin(), i);// 尾插lt.insert(lt.end(), i);// std::cout << "當i為   " << i << "     時list中的數據總量:      " << lt.size() << std::endl;}//lt.unique();//lt.remove(10);// 范圍for,C++創造者認為每次遍歷都要寫一個int太過于麻煩。// 所以直接支持了范圍for。// 范圍for會根據類中的begin()和end()函數(前面提到過的C++定好的函數名不要去改,不知道大家有沒有印象。)// 提供的迭代器進行訪問。for (auto& e : lt){std::cout << e << std::endl;}return 0;
}

? ? ? ? 2.3? ? ? ? front()函數和back()函數

? ? ? ? 前面小編提到鏈表頭插和尾插,那我們怎么快速拿到鏈表首尾的數據,查看是否頭插尾插成功了呢?front()和back()就可以很好的檢測這一點。

#include <iostream>
#include <list>int main()
{std::list<int> lt;for (int i = 0; i <= 13; ++i){lt.insert(lt.begin(), i);lt.insert(lt.end(), i);std::cout << "第" << i << "行" << "front:         " << lt.front() << "        back:             " << lt.back() << std::endl;}return 0;
}

? ? ? ? 2.4? ? ? ? begin()函數和end()函數

? ? ? ? 關于begin()函數和end()函數有一些要補充的內容,Vector的迭代器是隨機迭代器,與指針非常相似可以加減任意符合數組范圍的值來訪問該位置的值,而list的迭代器是雙向迭代器只能通過++、--來改變訪問的位置,畢竟list中的結點并不一定像Vector存儲一樣是連續的。

#include <iostream>
#include <list>int main()
{std::list<int> lt;for (int i = 0; i <= 13; ++i){lt.insert(lt.begin(), i);}std::list<int>::iterator it = lt.begin();while (it != lt.end()){std::cout << *it << std::endl;// 報錯//it + 3;// 雙向迭代器。++it;}return 0;
}

? ? ? ? 2.5? ? ? ? push_front函數和push_back()函數

? ? ? ? 通過函數名稱可以得知這是頭插和尾插函數。話不多說直接上案例。

#include <iostream>
#include <list>int main()
{std::list<int> lt;for (int i = 0; i <= 13; ++i){lt.push_front(i);lt.push_back(i);std::cout << "第" << i << "行" << "front:         " << lt.front() << "        back:             " << lt.back() << std::endl;}return 0;
}

? ? ? ? 2.6? ? ? ? pop_front函數和pop_back()函數

????????通過函數名稱可以得知這是頭刪和尾刪函數。和上面對比很好理解。那為什么Vector沒有頭插頭刪,list卻有?因為效率!還是效率!Vector的結構就像數組一樣,一個指針變量指向一塊地址開頭,進行訪問使用。指針指向一塊地址的開頭該怎么頭刪?只能將要刪除的位置之后的數據往前移動一個單位,正好將要刪除位置的數據覆蓋掉。這非常影響效率,所以沒有實現該函數。不過大家可以試試deque容器,Vector和List的特性兼具,既可以頭刪又可以尾刪。至于為什么等以后再說吧。

????????2.7? ? ? ? unique()函數、remove()函數、remove_if()函數

? ? ? ? unique()函數是去重函數,remove()函數是刪除數據為參數的函數,remove_if()函數就有一點超綱了,是根據條件刪除,那怎么傳條件呢?通過仿函數(就是像函數調用的類調用形式。)

#include <iostream>
#include <list>// 仿函數
class Like_Function
{
public:bool operator () (int x){// 刪除偶數if (x % 2 == 0){// 函數返回值為true對應的參數會被刪除。return true;}return false;}
};int main()
{std::list<int> lt;for (int i = 0; i <= 13; ++i){// 這里我故意插入兩個相同值。// 頭插lt.insert(lt.begin(), i);// 尾插lt.insert(lt.end(), i);}// 去重。lt.unique();// 去掉特殊值。lt.remove(10);// 可以傳一個匿名對象(寫起來方便,就相當于C語言的臨時值)lt.remove_if(Like_Function(/*構造函數要的參數*/));for (auto& e : lt){std::cout << e << std::endl;}return 0;
}

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

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

相關文章

第十五節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - vue前端 生產部署

Vben Admin vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) + Python …

背包初步(0-1背包、完全背包)

當月光灑在我的臉上 我想我就快變了模樣 有一種叫做撕心裂肺的湯 喝了它有神奇的力量 動態規劃初步&#xff08;完全背包&#xff09; 目錄動態規劃初步&#xff08;完全背包&#xff09;0-1背包簡介完全背包檢查數組是否存在有效劃分&#xff08;前綴劃分DP&#xff09;單詞拆…

Linux驅動06 --- UDP

目錄 一、UDP 1.1 介紹 1.2 UDP 的通信方式 1.3 單播 發送函數 接收函數 1.4 廣播 1.5 組播/多播 一、UDP 1.1 介紹 傳輸層的另外一個協議 面向無連接&#xff0c;不穩定&#xff0c;速度快&#xff0c;可以一對多 UDP&#xff08;User Datagram Protocol&…

AJAX 投票:技術解析與應用場景

AJAX 投票:技術解析與應用場景 引言 隨著互聯網技術的不斷發展,Web應用的用戶體驗越來越受到重視。AJAX(Asynchronous JavaScript and XML)作為一種重要的技術,在實現異步數據交互方面發揮著關鍵作用。本文將深入探討AJAX投票系統的技術原理、應用場景以及優化策略。 A…

【字節跳動】數據挖掘面試題0017:推薦算法:雙塔模型,怎么把內容精準地推送給用戶

文章大綱 雙塔模型:推薦算法中的“高效匹配引擎一、雙塔模型的核心思想:“分而治之” 的匹配邏輯二、雙塔模型的結構:從特征輸入到相似度輸出1. 輸入層:特征的 “原材料處理”2. 塔網絡層:用戶與物品的“個性化編碼”3. 交互層:向量相似度的“偏好打分”三、雙塔模型的優…

7月14日日記

數學類今天考完最后一科英語放假回家了。有點羨慕他們。今天英語成績出來了&#xff0c;我是89分&#xff0c;一開始有點失望&#xff0c;感覺沒有上90&#xff0c;這是一個很好的沖擊4.0 的機會。但是后來一想好像也沒什么可惜的&#xff0c;這個分數還是很高的。舍友小林是90…

js的局部變量和全局變量

全局變量常常定義在函數外&#xff0c;具有全局定義域&#xff0c;在整個js代碼的任何地方都可以使用&#xff0c;這個就叫全局變量局部變量定義在函數內部&#xff0c;只在當前函數的定義域可以被使用&#xff0c;而且不同的函數可以定義相同的局部變量&#xff0c;他們之間相…

C++ 多態詳解:從概念到實現原理----《Hello C++ Wrold!》(14)--(C/C++)

文章目錄前言多態的概念多態的定義和實現虛函數虛函數的重寫(覆蓋)多態的構成條件override 和 final&#xff08;C11提出&#xff09;finaloverride重載、覆蓋(重寫)、隱藏(重定義)的對比抽象類接口繼承和實現繼承多態的原理虛函數表(也叫做虛表)引申:虛表的打印多態的原理靜態…

Node.js + Express的數據庫AB View切換方案設計

方案總覽數據導入過程&#xff1a; - 根據控制表判斷當前活躍組&#xff08;假設當前活躍的是a&#xff0c;那么接下來要導入到b&#xff09;。 - 清空非活躍表&#xff08;即b表&#xff09;的數據&#xff0c;然后將新數據導入到b表。 - 切換控制表&#xff0c;將活…

C++_編程提升_temaplate模板_案例

類模板案例案例描述: 實現一個通用的數組類&#xff0c;要求如下&#xff1a;可以對內置數據類型以及自定義數據類型的數據進行存儲將數組中的數據存儲到堆區構造函數中可以傳入數組的容量提供對應的拷貝構造函數以及operator防止淺拷貝問題提供尾插法和尾刪法對數組中的數據進…

Win11系統安裝Anaconda環境極簡教程

Win11系統安裝Anaconda環境極簡教程 &#x1f4e5; 第一步&#xff1a;下載 Anaconda 安裝包 打開瀏覽器&#xff0c;訪問 Anaconda 官網&#xff0c;選擇View All Installers 選擇所需版本&#xff08;此文以2024.02-1為例&#xff09;&#xff0c;點擊進行下載&#xff08;…

Datawhale AI夏令營-基于帶貨視頻評論的用戶洞察挑戰賽

一.賽事目標基于星火大模型Spark 4.0 Ultra&#xff0c;對視頻和評論的數據進行商品識別&#xff0c;情感分析&#xff0c;歸類分析&#xff0c;最終為帶貨效果進行評價。并通過優化模型來提高評價準確度二.賽事環境1.基礎平臺&#xff1a;星火大模型Spark 4.0 Ultra2.賽事數據…

如何基于FFMPEG 實現視頻推拉流

文章目錄 前言環境準備為什么選擇 FFmpeg什么是nginx 1.7.11.3 GryphonNginx的conf配置啟動nginx推流命令接收視頻流Untiy播放視頻流最后前言 我們經常會有在電腦上實現推拉流的需求,Unity 和Unreal 都提供了基于WebRTC 的視頻流方案,效果還不錯,但是當我們需要推拉整個電腦…

飛算JavaAI:從情緒價值到代碼革命,智能合并項目與定制化開發新范式

目錄一、飛算 JavaAI 是什么&#xff1f;二、飛算JavaAI&#xff1a;安裝登錄2.1 IDEA插件市場安裝&#xff08;推薦&#xff09;2.2 離線安裝包三、飛算JavaAI核心功能&#xff1a;一鍵生成完整工程代碼功能背景3.1 理解需求3.2 設計接口3.3 表結構自動設計3.4 處理邏輯&#…

Python 基礎語法與數據類型(十一) - 類 (class) 與對象 (實例)

文章目錄1. 什么是類 (Class)&#xff1f;1.1 定義一個類2. 什么是對象 (Object) 或實例 (Instance)&#xff1f;2.1 創建對象&#xff08;實例化&#xff09;3. 訪問屬性和調用方法4. 類屬性 vs 實例屬性5. self 的重要性總結練習題練習題答案前幾篇文章我們學習了變量、數據類…

精準數據檢索+數據飛輪自驅優化,彩訊AI知識庫助力企業知識賦能和效率創新

近兩年&#xff0c;人工智能技術的精細化發展&#xff0c;讓知識庫概念重新成為“熱門詞匯”&#xff0c;騰訊ima等智能工作臺產品為個人用戶打造專屬知識庫&#xff0c;而面向B端市場&#xff0c;企業AI知識庫也逐步成為企業集中存儲與管理核心文檔、數據、經驗和流程的知識中…

打破空間邊界!Nas-Cab用模塊化設計重構個人存儲邏輯

文章目錄前言1. Windows安裝Nas-Cab2. 本地局域網連接Nas-Cab3. 安裝Cpolar內網穿透4. 固定Nas-Cab 公網地址"數據管理不該受制于硬件形態或地理邊界。這個開源方案證明&#xff1a;當功能模塊化且可擴展時&#xff0c;私有云可以像水一樣滲透進所有設備——現在就去Git倉…

Sigma-Aldrich細胞培養基礎知識:細胞培養的安全注意事項

細胞培養實驗室風險評估風險評估的主要目的是防止人員受傷&#xff0c;保護財產&#xff0c;并避免對個人和環境的傷害。在許多國家&#xff0c;法律要求進行風險評估。例如&#xff0c;英國的《英國職業健康與安全法案&#xff08;1974年&#xff09;》就是一個例子。歐洲共同…

Imx6ull用網線與電腦連接

理解工作方式沒有路由器時&#xff0c;可以使用&#xff0c;只要保持虛擬機的兩個網卡一個與電腦在同一網,一個與板子在同一網段(保持通信)就可以從虛擬機往板子下載第一步&#xff1a;查看電腦連接的網絡這一步是在找到主機ip地址這兩步在其他同類教程里一樣的第二步:設置以太…

力扣454.四數相加Ⅱ

給你四個整數數組 nums1、nums2、nums3 和 nums4 &#xff0c;數組長度都是 n &#xff0c;請你計算有多少個元組 (i, j, k, l) 能滿足&#xff1a;0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0示例 1&#xff1a;輸入&#xff1a;nums1 [1,2], nums2 …