C++ STL容器:序列式容器-鏈list,forward_list

摘要:

??CC++ STL(Standard Template Library,標準模板庫)在C++編程中的重要性不容忽視,STL提供了一系列容器、迭代器、算法和函數對象,這些組件極大地提高了C++程序的開發效率和代碼質量。

STL 容器 分為 2 大類 , 分別是“序列式容器” 和“關聯式容器 ”。

  • 序列式容器:每個元素都有固定位置,取決于插入時機和地點,其底層為線性序列的數據結構,里面存儲的是元素本身。
  • 關聯式容器:元素位置取決于特定的排序準則,和插入順序無關,其里面存儲的是< key , value >結構的鍵值對,在數據檢索時比序列式容器效率更高。

??本系列博文將詳細介紹C++STL的各種容器的特性優缺點,以及其常用算法方法等。本文介紹的是序列式容器-鏈list,forward_list。

(開發環境:VScode,C++17)

關鍵詞C++STL數據存儲數據類型鏈表listforward_list

聲明:本文作者原創,轉載請附上文章出處與本文鏈接。

文章目錄

      • 摘要:
      • 正文:
        • list
          • 常用函數:
          • 使用例子:
        • forward_list
          • 常用函數:
          • 使用例子:
      • 推薦閱讀

正文:

list

在C++標準模板庫(STL)中,list 是一個雙向鏈表容器,它允許在常數時間內從鏈表的任何位置插入和刪除元素。與 vectordeque 相比,list 在內存中的元素不是連續存儲的,這意味著它不支持對元素的直接訪問(即沒有 operator[]),但它提供了在鏈表中的任何位置進行快速插入和刪除的能力。(有需要更深入了解數據結構鏈的,可看同專欄下數據結構分支)。

常用函數:
  • size():返回鏈表中元素的數量。
  • empty():檢測容器是否為空。
  • begin():返回指向鏈表第一個元素的迭代器。
  • end():返回指向鏈表尾后位置的迭代器。
  • push_back():在鏈表末尾插入一個元素。
  • push_front():在鏈表開頭插入一個元素。
  • pop_back():刪除鏈表末尾一個元素。
  • pop_front():刪除鏈表開頭一個元素。
  • insert():在迭代器 pos 指向的位置之前插入元素,并返回指向新插入元素的迭代器。
  • erase():刪除迭代器 pos 指向的元素,并返回指向下一個元素的迭代器。
使用例子:
#include <iostream>
#include <list>int main()
{// 創建一個空的 std::liststd::list<int> myList;// 使用 empty 檢查列表是否為空std::cout << "Is the list empty? " << (myList.empty() ? "Yes" : "No") << std::endl;// 使用 push_back 在列表末尾添加元素myList.push_back(1);myList.push_back(2);myList.push_back(3);// 使用 size 獲取列表中的元素數量std::cout << "Size of the list: " << myList.size() << std::endl;// 使用 begin 和 end 獲取迭代器for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用 push_front 在列表開頭添加元素myList.push_front(0);// 使用 insert 在特定位置插入元素// 注意:insert 需要一個迭代器作為插入位置,以及要插入的值std::list<int>::iterator it_to_insert = myList.begin(); std::advance(it_to_insert, 2); // 假設我們想在第三個位置插入元素myList.insert(it_to_insert, 100);// 再次打印列表以查看插入效果for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用 erase 刪除元素// 可以通過迭代器刪除單個元素,或者通過兩個迭代器刪除一個范圍it_to_insert = myList.begin();std::advance(it_to_insert, 3); // 假設我們想刪除第四個元素myList.erase(it_to_insert);// 打印列表以查看刪除效果for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}
forward_list

forward_list 是 C++ 標準模板庫 (STL) 中的一個容器,它表示一個單向鏈表。與 list 不同,forward_list 是一種更簡單的鏈表實現,因為它只包含指向前一個元素的鏈接(對于頭元素之外的所有元素),而沒有指向后一個元素的鏈接。

常用函數:
  • size():返回鏈表中元素的數量。
  • empty():檢測容器是否為空。
  • begin():返回指向鏈表第一個元素的迭代器。
  • end():返回指向鏈表尾后位置的迭代器。
  • push_front():在鏈表開頭插入一個元素。
  • pop_front():刪除鏈表頭部的一個元素。
  • insert_after():在指定位置之后插入一個新元素,并返回一個指向新元素的迭代器。
  • erase_after():刪除容器中某個指定位置或區域內的所有元素。
使用例子:
#include <iostream>  
#include <forward_list>  int main()
{// 創建一個空的 forward_liststd::forward_list<int> myList;// 使用 push_front 在列表開頭添加元素myList.push_front(1);myList.push_front(2);myList.push_front(3);// 使用 size 獲取列表中的元素數量std::cout << "Size of the forward_list: " << myList.size() << std::endl;// 使用 empty 檢查列表是否為空std::cout << "Is the forward_list empty? " << (myList.empty() ? "Yes" : "No") << std::endl;// 使用 begin 和 end 獲取迭代器for (std::forward_list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用 insert_after 在特定位置之后插入元素// 注意:forward_list 沒有 insert 函數,而是 insert_afterauto it_to_insert_after = myList.begin();std::advance(it_to_insert_after, 1); // 假設我們想在第二個元素之后插入元素myList.insert_after(it_to_insert_after, 100);// 再次打印列表以查看插入效果for (std::forward_list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用 erase_after 刪除元素// 需要先找到要刪除的元素的迭代器auto it_to_erase = myList.begin();std::advance(it_to_erase, 2); // 假設我們想刪除第三個元素myList.erase_after(it_to_erase);// 打印列表以查看刪除效果for (std::forward_list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

推薦閱讀

博客主頁:https://blog.csdn.net/weixin_45068267
(客官逛一逛,有許多其它有趣的專欄博文)

C/C++專欄:https://blog.csdn.net/weixin_45068267/category_12268204.html
(內含其它STL容器使用及對應的數據結構實現)

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

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

相關文章

Halcon 銑刀刀口破損缺陷檢測

一 OTSU OTSU&#xff0c;是一種自適應閾值確定的方法,又叫大津法&#xff0c;簡稱OTSU&#xff0c;是一種基于全局的二值化算法,它是根據圖像的灰度特性,將圖像分為前景和背景兩個部分。當取最佳閾值時&#xff0c;兩部分之間的差別應該是最大的&#xff0c;在OTSU算法中所采…

排序 -- 萬能測試oj

. - 力扣&#xff08;LeetCode&#xff09; 這道題我們可以使用我們學過的那些常見的排序方法來進行解答 //插入排序 void InsertSort(int* nums, int n) {for (int i 0; i < n-1; i){int end i;int tmp nums[end 1];while (end > 0){if (tmp < nums[end]){nums[…

PyVideoTrans:一款功能全面的視頻翻譯配音工具!【送源碼】

PyVideoTrans是一款功能全面的視頻翻譯配音工具&#xff0c;專為視頻內容創作者設計。它能夠將視頻中的語言翻譯成另一種語言&#xff0c;并自動生成與之匹配的字幕和配音。支持多種語言&#xff0c;包括但不限于中文&#xff08;簡繁體&#xff09;、英語、韓語、日語、俄語、…

10、廣告-用戶數據中心

用戶數據中心 用戶數據中心在程序化廣告中扮演著至關重要的角色&#xff0c;它主要包括DMP原理、用戶畫像邏輯、Look Alike原理和DMP對接DSP四個部分。下面&#xff0c;我們將詳細講解每個部分的內容。 &#xff08;一&#xff09;DMP原理 數據管理平臺&#xff08;Data Man…

Wormhole Filters: Caching Your Hash on Persistent Memory——泛讀筆記

EuroSys 2024 Paper 論文閱讀筆記整理 問題 近似成員關系查詢&#xff08;AMQ&#xff09;數據結構可以高效地近似確定元素是否在集合中&#xff0c;例如Bloom濾波器[10]、cuckoo濾波器[23]、quotient濾波器[8]及其變體。但AMQ數據結構的內存消耗隨著數據規模的增長而快速增長…

MSPM0G3507——串口0從數據線傳輸變為IO口傳輸

默認的跳線帽時這樣的&#xff0c;這樣時是數據線傳輸 需要改成這樣&#xff0c;即可用IO口進行數據傳輸

windows系統本地端口被占用的問題

第一步&#xff1a;查找所有運行的端口 按住“WindowsR”組合鍵&#xff0c;打開命令窗口&#xff0c;輸入【cmd】命令&#xff0c;回車。在彈出的窗口中輸入 命令【netstat -ano】&#xff0c;再按一下回車鍵 Win系統端口被占用-查找所有運行的端口 第二步&#xff1a;查看…

opencv_C++學習筆記(入門30講)

文章目錄 1.配置開發環境2.圖像讀取與顯示3.圖像色彩空間轉換4.圖像對象的創建與賦值5.圖像像素的讀寫操作6.圖像像素的算數操作7.滾動條-調整圖像亮度8.滾動條-調整對比度和亮度9.鍵盤響應操作10.圖像像素的邏輯操作11.圖像的通道分離和合并12.圖像色彩空間轉換13.圖像的像素值…

阿里云存儲的降本增效與運維

小浩負責公司存儲架構層&#xff0c;需要確保存儲層不會成為公司業務系統的性能瓶頸&#xff0c;讓數據讀寫達到最佳性能。那么小浩可以從哪些方面著手優化性能呢&#xff1f;他繼續求助系統架構師大雷。 小浩&#xff1a;雷哥&#xff0c;PD反饋公司系統最近響應很慢&#xff…

HTTP模塊(一)

HTTP服務 本小節主要講解HTTP服務如何創建服務&#xff0c;查看HTTP請求&響應報文&#xff0c;還有注意事項說明&#xff0c;另外講解本地環境&Node環境&瀏覽器之間的鏈路圖示&#xff0c;如何提取HTTP報文字符串&#xff0c;及報錯信息查詢。 創建HTTP服務端 c…

lspci

【原】Linux之PCIE三種空間解析 PCIe學習筆記——2.PCIe配置空間 PCIE學習&#xff08;2&#xff09;PCIE配置空間詳解 開發者分享 | 使用 lspci 和 setpci 調試 PCIe 問題 b : 字節 w&#xff1a;word L&#xff1a; 4byte

LLM - 詞表示和語言模型

一. 詞的相似度表示 (1): 用一系列與該詞相關的詞來表示 (2): 把每個詞表示一個獨立的符號(one hot) (3): 利用該詞上下文的詞來表示該詞 (3): 建立一個低維度的向量空間&#xff0c;用深度學習方法將該詞映射到這個空間里(Word Embedding) 二&#xff1a;語言模型 (1): 根…

Postman中數據文件的高效使用:測試自動化與數據驅動測試實踐

摘要 Postman 是一個強大的 API 開發工具&#xff0c;它不僅支持 API 的設計、開發和測試&#xff0c;還提供了數據驅動測試的功能。通過使用數據文件&#xff0c;我們可以模擬不同的測試場景&#xff0c;實現測試的自動化和重復執行。本文將詳細介紹如何在 Postman 中使用數據…

PHP-實例-CSRF

1 需求 按照用途分類&#xff1a; 會話&#xff08;會話ID和會話令牌 二選一&#xff09; 會話ID&#xff1a;服務器側自動生成&#xff0c;自動存儲在cookie中&#xff0c;需要在服務器側存儲會話令牌&#xff1a;服務器側手動生成&#xff0c;手動存儲在cookie中&#xff0…

7月07日,每日信息差

第一、6 月份&#xff0c;北京、上海、廣州和深圳的新建商品住宅成交量分別環比增加 21%、66%、48% 和 38%&#xff0c;均創年內新高 第二、2024 年世界人工智能大會上&#xff0c;上海向四家企業發放了首批無駕駛人智能網聯汽車示范應用許可&#xff0c;這些企業可以在浦東部…

Redis源碼整體結構

一 前言 Redis源碼研究為什么先介紹整體結構呢?其實也很簡單,作為程序員的,要想對一個項目有快速的認知,對項目整體目錄結構有一個清晰認識,有助于我們更好的了解這個系統。 二 目錄結構 Redis源碼download到本地之后,對應結構如下: 從上面的截圖可以看出,Redis源碼一…

52-5 內網代理2 - LCX端口轉發(不推薦使用LCX)

環境搭建: 本地開3臺虛擬機:kali(必須)、windows2012與2008 (可換成其他windows虛擬機) kali - 網絡配置成橋接模式 windows2012 - 設置兩個網卡,NAT與橋接模式 注意:windows2012要關閉防火墻,要不然其他主機ping不通 關閉防火墻后再開啟遠程桌面連接 windwos20…

去O化神器 Exbase

隨著去O化進程推動&#xff0c;很多舊業務依賴的oracle數據庫&#xff0c;都需要實現做數據庫的替換&#xff0c;當下能很好兼容Oracle&#xff0c;并實現異構數據庫之間轉換的工具并不多。這里給大家推薦一個商業工具數據庫遷移工具exbase&#xff08;北京海量&#xff09;&am…

昇思MindSpore 25天學習打卡營|day18

DCGAN生成漫畫頭像 在下面的教程中&#xff0c;我們將通過示例代碼說明DCGAN網絡如何設置網絡、優化器、如何計算損失函數以及如何初始化模型權重。在本教程中&#xff0c;使用的動漫頭像數據集共有70,171張動漫頭像圖片&#xff0c;圖片大小均為96*96。 GAN基礎原理 這部分原…

想知道你的電腦能不能和如何升級RAM嗎?這里有你想要的一些提示

考慮給你的電腦增加更多的RAM,但不確定從哪里開始?本指南涵蓋了有關升級Windows PC或筆記本電腦中RAM的所有信息。 你需要升級RAM嗎 在深入研究升級RAM的過程之前,評估是否需要升級是至關重要的。你是否經歷過系統滯后、頻繁的BSOD錯誤或應用程序和程序突然崩潰?這些癥狀…