【C++入門到精通】C++入門 —— list (STL)


閱讀導航

  • 前言
  • 一、list簡介
    • 1.概念
    • 2.特點
  • 二、list的使用
    • 1.list的構造
    • 2.常見的操作
      • ?std::list類型的增、刪、查、改
  • 三、list與vector的對比
  • 溫馨提示

前言

文章綁定了VS平臺下std::list的源碼,大家可以下載了解一下😍

前面我們講了C語言的基礎知識,也了解了一些數據結構,并且講了有關C++的命名空間的一些知識點以及關于C++的缺省參數、函數重載,引用 和 內聯函數也認識了什么是類和對象以及怎么去new一個 ‘對象’ ,以及學習了幾個STL的結構也相信大家都掌握的不錯,接下來博主將會帶領大家繼續學習有關C++比較重要的知識點—— list(STL)。下面話不多說坐穩扶好咱們要開車了😍

一、list簡介

1.概念

std::list是C++標準庫中的雙向鏈表容器。(這里有官方介紹鏈接) 它支持在任意位置進行快速插入和刪除操作,并且在需要對元素進行頻繁的插入和刪除操作時,通常比std::vector更高效。std::list的元素不是在連續內存中存儲,而是通過指針相互連接在一起。
list的模型化圖像

2.特點

  1. 雙向訪問:std::list的元素可以通過雙向迭代器從前向后或者從后向前進行訪問。

  2. 插入和刪除操作高效:由于std::list的元素是通過指針連接在一起的,插入和刪除操作只需要修改相鄰元素的指針,因此在任意位置進行插入和刪除操作的時間復雜度是O(1)。

  3. 不支持隨機訪問:由于std::list的元素不是在連續內存中存儲的,因此不能通過下標來隨機訪問元素。如果需要隨機訪問元素,可以考慮使用std::vector或者std::array。

  4. 內存占用相對較大:由于每個元素都需要額外的指針來連接其他元素,std::list的內存占用相對較大。

二、list的使用

list 中的接口比較多,此處類似,只需要掌握如何正確的使用,然后再去深入研究背后的原理,已達到可擴展的能力。以下為list中一些常見的重要接口

1.list的構造

std::list類提供了多個構造函數,用于創建和初始化std::list對象。官方鏈接點這里跳轉 下面是常用的構造函數列表:

  1. 默認構造函數:

    std::list<T> myList;
    

    創建一個空的std::list對象,其中T是元素的類型。

  2. 帶有容量參數的構造函數:

    std::list<T> myList(size, value);
    

    創建一個包含size個元素的std::list對象,每個元素的值都是value。

  3. 區間構造函數:

    std::list<T> myList(first, last);
    

    創建一個std::list對象,其中包含[first, last)區間的元素。first和last是輸入迭代器,用于指定要拷貝到新std::list中的元素范圍。

  4. 拷貝構造函數:

    std::list<T> myList(otherList);
    

    創建一個std::list對象,其中包含與otherList相同的元素。這將執行深拷貝,即將otherList中的元素復制到新的std::list對象中。

  5. 移動構造函數:

    std::list<T> myList(std::move(otherList));
    

    創建一個std::list對象,并從其他std::list對象otherList中移動元素到新的std::list對象中。在移動構造函數后,otherList將為空。

注意:上述構造函數中的T表示元素的類型,可以是任何有效的C++類型

#include <list>int main() {// 默認構造函數std::list<int> myList;// 帶有容量參數的構造函數std::list<int> myList2(5, 10); // 包含5個值為10的元素// 區間構造函數int arr[] = {1, 2, 3, 4, 5};std::list<int> myList3(std::begin(arr), std::end(arr)); // 包含數組arr的元素// 拷貝構造函數std::list<int> myList4(myList2);// 移動構造函數std::list<int> myList5(std::move(myList4)); // myList4將為空return 0;
}

這些是std::list常用的構造函數示例。你可以根據自己的需求選擇適當的構造函數來創建std::list對象。

2.常見的操作

?std::list類型的增、刪、查、改

  1. 插入元素:

    • push_back(value):在列表的末尾插入一個元素。
    • push_front(value):在列表的開頭插入一個元素。
    • insert(pos, value):在指定位置pos之前插入一個元素。
  2. 刪除元素:

    • pop_back():刪除列表末尾的元素。
    • pop_front():刪除列表開頭的元素。
    • erase(pos):刪除指定位置pos處的元素。
    • erase(first, last):刪除從[first, last)范圍內的所有元素。
  3. 訪問元素:

    • front():返回列表的第一個元素的引用。
    • back():返回列表的最后一個元素的引用。
  4. 迭代器操作:

    • begin():返回指向列表第一個元素的迭代器。
    • end():返回指向最后一個元素之后位置的迭代器。
    • rbegin():返回指向列表最后一個元素的逆向迭代器。
    • rend():返回指向第一個元素之前位置的逆向迭代器。
  5. 大小和清空操作:

    • size():返回列表中元素的數量。
    • empty():檢查列表是否為空。
    • clear():清除列表中的所有元素。
  6. 修改元素:

    • assign(first, last):用[first, last)范圍內的元素替換列表的內容。
    • assign(n, value):用n個值為value的元素替換列表的內容。
    • resize(count):改變列表的大小,使其包含count個元素,并根據需要插入或刪除元素。
    • swap(otherList):交換當前列表與otherList之間的內容。
  7. 查找和排序:

    • find(value):返回指向第一個值為value的元素的迭代器;如果找不到,則返回end()。
    • sort():按升序對列表中的元素進行排序。
    • reverse():反轉列表中的元素的順序。

以上只是std::list的一些常見操作,還有很多其他的成員函數可用于更復雜的操作。這里有官方的鏈接你可以根據具體的需求選擇適當的操作。

以下是一些示例,展示了std::list的常見操作:

#include <list>
#include <iostream>int main() {std::list<int> myList;// 插入元素myList.push_back(1);myList.push_front(2);myList.insert(std::next(myList.begin()), 3);// 刪除元素myList.pop_back();myList.pop_front();myList.erase(std::next(myList.begin()));// 訪問元素std::cout << "Front element: " << myList.front() << std::endl;std::cout << "Back element: " << myList.back() << std::endl;// 迭代器操作for (auto it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 大小和清空操作std::cout << "Size: " << myList.size() << std::endl;std::cout << "Empty: " << (myList.empty() ? "Yes" : "No") << std::endl;myList.clear();// 查找和排序myList.push_back(5);myList.push_back(2);myList.push_back(4);myList.push_back(1);auto it = myList.find(4);ifit != myList.end()) {std::cout << "Found value 4" << std::endl;}myList.sort();std::cout << "Sorted list: ";for (const auto& element : myList) {std::cout << element << " ";}std::cout << std::endl;return 0;
}

三、list與vector的對比

  1. 數據存儲方式:

    • vector:使用連續的內存塊存儲,可以在O(1)時間內訪問任意位置的元素。
    • list:使用雙向鏈表存儲,每個節點存儲一個元素,在O(n)時間內訪問任意位置的元素。
  2. 動態性:

    • vector:動態數組,長度可變。能夠動態增長和收縮,但在插入和刪除操作時可能需要重新分配內存,導致數據的搬移。
    • list:由于使用鏈表存儲,插入和刪除操作相對快速,不會涉及內存的重新分配和數據的搬移。
  3. 訪問效率:

    • vector:由于數據存儲在連續的內存塊中,可以通過下標訪問元素,提供了O(1)的隨機訪問效率。
    • list:需要遍歷鏈表才能訪問到指定位置的元素,訪問效率為O(n)。
  4. 插入和刪除操作:

    • vector:在尾部進行插入和刪除操作效率高,復雜度為O(1);在中間或頭部進行插入和刪除操作會導致后續元素的移動,復雜度為O(n)。
    • list:在插入和刪除操作時,只需修改相鄰節點的指針,復雜度為O(1),對于任意位置的插入和刪除都具有較高效率。
  5. 內存使用:

    • vector:由于數據存儲在連續的內存塊,相對于list可能產生更少的內存開銷。
    • list:由于每個元素需要額外的指針進行連接,相對于vector可能產生更多的內存開銷。

綜上所述,當需要頻繁進行隨機訪問操作或者需要動態增長和收縮容量時,vector是一個更好的選擇。而在需要頻繁進行插入和刪除操作、對訪問效率要求不高或者需要避免數據搬移時,list是一個更合適的選擇。

溫馨提示

感謝您對博主文章的關注與支持!在閱讀本篇文章的同時,我們想提醒您留下您寶貴的意見和反饋。如果您喜歡這篇文章,可以點贊、評論和分享給您的同學,這將對我提供巨大的鼓勵和支持。另外,我計劃在未來的更新中持續探討與本文相關的內容。我會為您帶來更多關于C++以及編程技術問題的深入解析、應用案例和趣味玩法等。請繼續關注博主的更新,不要錯過任何精彩內容!

再次感謝您的支持和關注。我們期待與您建立更緊密的互動,共同探索C++、算法和編程的奧秘。祝您生活愉快,排便順暢!

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

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

相關文章

C語言實例_獲取文件MD5值

一、MD5介紹 MD5&#xff08;Message Digest Algorithm 5&#xff09;是一種常用的哈希函數算法。將任意長度的數據作為輸入&#xff0c;并生成一個唯一的、固定長度&#xff08;通常是128位&#xff09;的哈希值&#xff0c;稱為MD5值。MD5算法以其高度可靠性和廣泛應用而聞名…

全球磁強計市場價值約為16.2億美元,預測期內將以超過5.21%的增長率增長

磁強計是一種用于測量磁場強度和方向的儀器。它可以檢測和測量地球磁場、物體的磁性、地下礦藏、磁性材料等。磁強計在地球科學、物理學、地質學、勘探、礦業等領域具有廣泛的應用。 根據阿譜爾&#xff08;APO&#xff09;的統計及預測&#xff0c;2022年全球磁強計市場價值約…

跳跳!(c++題解)

題目描述 你是一只小跳蛙&#xff0c;你特別擅長在各種地方跳來跳去。 這一天&#xff0c;你和朋友小 F 一起出去玩耍的時候&#xff0c;遇到了一堆高矮不同的石頭&#xff0c;其中第 ii 塊的石頭高度為 hi?&#xff0c;地面的高度是 h0?0。你估計著&#xff0c;從第 ii 塊…

ts與vue

ts與Vue 如果你已經學習了typeScript,但不知道如何在vue項目中使用&#xff0c;那么這篇文章將會很適合你。參考千峰教育 kerwin視頻 1.會自動推導&#xff0c;隱士推導。提示 類型系統。 獨立模塊。 isolatedModules選項&#xff1a;是否配置為獨立的模塊。 減少報錯 let …

dispatcherServlet在tomcat啟動時如何被加載(1)

目錄 在springboot工程中, 如何添加一個servlet呢? 方法1 : 使用WebServlet注解 方法2 : 使用ServletRegistrationBean進行注冊 springmvc 采用的就是方式2和springboot集成的, 看一下源碼 springboot 字段裝配里面有這個類, 看一下源碼 90行, 創建了一個DispatcherServlet對象…

深入探究Socks5代理與IP代理在網絡安全與爬蟲中的應用

1. Socks5代理&#xff1a;打開網絡隧道的多功能工具 Socks5代理是一種流行的代理協議&#xff0c;它在傳輸層為數據包提供了隧道。相較于之前的版本&#xff0c;Socks5不僅支持TCP連接&#xff0c;還可以處理UDP流量&#xff0c;使其在需要實時數據傳輸的應用中表現出色。在網…

Zabbix配置通用的TCP/IP:port監控項

我們經常的用接口&#xff0c;比如說FTP、HTTP、DNS、數據庫接口&#xff0c;都可以用IP:PORT方式探測其是否存活&#xff0c;那么我們去繁就簡&#xff0c;就簡單監控一下IP&#xff1a;PORT吧&#xff01; 1、新建主機&#xff1a; 填入主機名稱、群組、Agent就是127.0.0.1…

解決Adobe Flash Player已被屏蔽

問題&#xff1a;該插件不支持 原因&#xff1a;現在瀏覽器默認禁用flash 博主當前使用的是谷歌瀏覽器Chrome 2個主要方法都已經失效 搜索一圈后&#xff0c;之前博客給出的2個主要方法都已經失效。 1、flash.cn 下載本地播放器 2、在chrome中打開flash的禁用開關 2023年解…

LangChain源碼逐行解密之系統(二)

LangChain源碼逐行解密之系統 20.2 serapi.py源碼逐行剖析 我們可以看一下Google查詢的例子,在LangChain中有多種實現的方式。 如圖20-5所示,在utilities的serpapi.py代碼文件中實現了SerpAPIWrapper。 圖20- 5 utilities的serpapi.py的SerpAPIWrapper 在langchain目錄的se…

@pyrallis.wrap()

pyrallis.wrap import pyrallis pyrallis.wrap() 這個pyrallis.wrap()是什么 pyrallis.wrap() 是一個 Python 裝飾器&#xff08;Decorator&#xff09;&#xff0c;用于將函數或方法包裝在 Pyrallis 框架提供的性能分析器中。裝飾器是 Python 中的一種特殊語法&#xff0c;允許…

如何避免爬蟲IP被屏蔽

各位爬友們好&#xff0c;作為一名專業的爬蟲代理提供者&#xff0c;我要和大家分享一些避免爬蟲IP被屏蔽的實用技巧。你知道嗎&#xff0c;當我們爬取數據的時候&#xff0c;很容易被目標網站識別出來并封禁我們的IP地址&#xff0c;導致無法繼續爬取數據。這個問題困擾了很多…

7. 實現 API 自動生成

目錄 1. pom.xml中引用依賴 2. 引入相關的依賴 3. 編寫配置類 4. application.yml 中添加配置 5. API 常用注解 6. 訪問 API 列表 7. API 導入 Postman 使用 Springfox Swagger生成 API&#xff0c;并導入 Postman&#xff0c;完成API單元測試。 Swagger 簡介&#xff1a;Swag…

執行Lua腳本后一直查詢不到Redis中的數據(附帶問題詳細排查過程,一波三折)

文章目錄 執行Lua腳本后一直查詢不到Redis中的數據&#xff08;附帶詳細問題排查過程&#xff0c;一波三折&#xff09;問題背景問題1&#xff1a;Lua腳本無法切庫問題2&#xff1a;RedisTemlate切庫報錯問題3&#xff1a;序列化導致數據不一致問題4&#xff1a;Lua腳本中單引號…

Etcd備份及恢復

一、Etcd數據備份 1、備份命令 [rootlocalhost ~]# export ETCDCTL_API3 [rootlocalhost ~]# /data/etcd-3.4.9/bin/etcdctl --endpoints10.2.20.108:2379 snapshot save etcd-date "%Y-%m-%d_%H-%M-%S".snapshot 2、備份完成后會在當前目錄生成備份文件 [rootlo…

vue實現打印功能

在Vue應用中調用打印機功能&#xff0c;可以使用JavaScript的window.print()方法。這個方法會打開打印對話框&#xff0c;然后讓我們選擇打印設置并打印文檔&#xff0c;但是尼這種方法依賴于瀏覽器的打印功能。 以下是一個簡單的示例&#xff0c;演示如何在Vue組件中調用打印…

Linux Tracing Technologies

目錄 1. Linux Tracing Technologies 1. Linux Tracing Technologies Linux Tracing TechnologieseBPFXDPDPDK

Flask Web開發實戰(狼書)| 筆記第1、2章

前言 2023-8-11 以前對網站開發萌生了想法&#xff0c;又有些急于求成&#xff0c;在B站照著視頻敲了一個基于flask的博客系統。但對于程序的代碼難免有些囫圇吞棗&#xff0c;存在許多模糊或不太理解的地方&#xff0c;只會照葫蘆畫瓢。 而當自己想開發一個什么網站的時&…

ubuntu部署haproxy

HAProxy是可提供高可用性、負載均衡以及基于TCP和HTTP應用的代理. 1、更新系統報 通過在終端中運行以下命令&#xff0c;確保所有系統包都是最新的 sudo apt updatesudo apt upgrade2、安裝Haproxy sudo apt install haproxy設置開機自動啟動haproxy服務 sudo systemctl en…

Lnton羚通關于如何解決nanoPC-T4 upgrade報錯問題?

nanoPC-T4 在 ??# sudo apt update 和 sudo apt upgrade??升級或安裝軟件 ??sudo apt install xxx??時遇到以下問題&#xff1a;??Failed to set up interface with /etc/hostapd/? Setting up hostapd (2:2.6-15ubuntu2.8) ... Job for hostapd.service failed be…

ssm+vue醫院住院管理系統源碼和論文PPT

ssmvue醫院住院管理系統源碼和論文PPT012 開發工具&#xff1a;idea 數據庫mysql5.7(mysql5.7最佳) 數據庫鏈接工具&#xff1a;navcat,小海豚等 開發技術&#xff1a;java ssm tomcat8.5 摘 要 隨著時代的發展&#xff0c;醫療設備愈來愈完善&#xff0c;醫院也變成人們生…