【C++】:STL詳解 —— list類

目錄

list的概念

list的構造函數?

list的大小

size()

resize()

empty()

list的插入

push_front()和emplace_front()

push_back()和emplace_back()

insert()和emplace()

list的刪除

pop_front()

pop_back()

erase()

remove()?

remove_if()??

?unique()??

clear()

list的拼接

splice()

merge()

list的迭代器

迭代器類型

begin()和end()

rbegin()和rend()

list中的元素訪問

front()

back()

list的逆置


list的概念

  1. list是一種可以在常數范圍內在任意位置進行插入和刪除的序列式容器,并且該容器可以前后雙向迭代。
  2. list的底層是雙向鏈表結構,雙向鏈表中每個元素存儲在互不相關的獨立結點當中,在結點中通過指針指向其前一個元素和后一個元素。
  3. list與forward_list非常相似,最主要的不同在于forward_list是單鏈表,只能進行單方向迭代。
  4. list與其他容器相比,list通常在任意位置進行插入、刪除元素的執行效率更高。
  5. list 和 forward_list最大的缺陷是不支持在任意位置的隨機訪問,其次,list還需要一些額外的空間,以保存每個結點之間的關聯信息(對于存儲的類型較小元素來說這可能是一個重要的因素)。

list的構造函數?

默認構造函數:創建一個空鏈表

list<T> list_name;

填充構造函數:創建包含?n?個相同值的鏈表

list<int> list2(5, 10);  // 包含5個值為10的節點:{10, 10, 10, 10, 10}

范圍構造函數:通過迭代器范圍?[first, last)?初始化鏈表

int arr[] = {1, 2, 3};
list<int> list3(arr, arr + 3);  // 復制數組內容:{1, 2, 3}

拷貝構造函數:通過另一個鏈表深拷貝初始化

list<int> list4(list3);  // 拷貝 list3 的內容:{1, 2, 3}

移動構造函數:通過移動另一個鏈表的資源初始化(高效轉移所有權)

list<int> list5(move(list4));  // list4 變為空,list5 接管其內容

初始化列表構造函數(C++11 起):通過初始化列表直接賦值

list<int> list6 = {4, 5, 6};  // 直接初始化:{4, 5, 6}

?

list的大小

size()

  • size():返回當前元素數量
#include <list>
#include <iostream>int main() {list<int> mylist = {1, 2, 3, 4, 5};cout << "Size: " << mylist.size(); // 輸出 5return 0;
}

resize()

  • 若?n < size():截斷鏈表,僅保留前?n?個元素。

  • 若?n > size():擴展鏈表,新增元素默認初始化為?T()(或指定?value)。

std::list<int> mylist = {1, 2, 3};mylist.resize(5);     // 擴展為 {1, 2, 3, 0, 0}(填充默認值0)
mylist.resize(2);     // 截斷為 {1, 2}
mylist.resize(4, 99); // 擴展為 {1, 2, 99, 99}

empty()

檢查鏈表是否為空(等價于?size() == 0

std::list<int> mylist;
if (mylist.empty()) 
{std::cout << "List is empty!";
}

list的插入

push_front()和emplace_front()

  • push_front (const value_type& val)
    • ???在頭部插入元素(拷貝構造)。
  • emplace_front (Args&&... args);(C++11 起)
    • ?在頭部直接構造元素(避免臨時對象拷貝)

頭部插入

list<int> mylist;
mylist.push_front(10);  // 鏈表內容:{10}
mylist.push_front(20);  // 鏈表內容:{20, 10}

push_back()和emplace_back()

尾部插入

  • push_front (const value_type& val)
    • ???在尾部插入元素(拷貝構造)。
  • emplace_front (Args&&... args);(C++11 起)
    • ?在尾部直接構造元素(避免臨時對象拷貝)
mylist.push_back(30);   // 鏈表內容:{20, 10, 30}

insert()和emplace()

  • insert(iterator pos, const T& value) ?
    • 在迭代器 pos 指向的位置前插入元素(拷貝構造)。
  • emplace(iterator pos, Args&&... args)(C++11 起)
    • 在 pos 位置直接構造元素(更高效)。?

指定位置插入

示例一:插入單個元素

list<int> mylist = { 1, 2, 3 };
mulist.insert(mylist.begin(), 1);
// mylist { 1, 1, 2, 3 }

示例二:插入多個相同元素

list<int> mylist = { 1, 2, 3 };
list<int>::iterator it = mylist.begin();
myList.insert(it, 3, 100);     // 插入3個100
// mylist { 100, 100, 100, 1, 2, 3 }

示例三:插入范圍元素

list<int> mylist = { 1, 2, 3 };
list<int>::iterator it = mylist.end();vector<int> vec = {5, 6, 7};
myList.insert(it, vec.begin(), vec.end());  // 在末尾插入vector內容
// mylist { 1, 2, 3, 4, 5, 6 }

list的刪除

pop_front()

頭部刪除,移除鏈表第一個元素

list<int> mylist = { 1, 2, 3 };
mylist.pop_front();    // mylist:{ 2, 3 }

pop_back()

尾部刪除,移除鏈表最后一個元素

list<int> mylist = { 1, 2, 3 };
mylist.pop_back();    // mylist:{ 1, 2 }

erase()

任意位置刪除

erase(iterator pos)
刪除迭代器?pos?指向的元素

list<int> mylist = {10, 20, 30, 40};auto it = mylist.begin() + 2;
mylist.erase(it);        // 刪除30 → {10, 20, 40}

erase(iterator first, iterator last)
刪除迭代器范圍?[first, last)?內的元素(左閉右開)

list<int> mylist = {1, 2, 3, 4, 5};
auto it = mylist.erase(v.begin() + 1, v.begin() + 3); 
// 刪除元素 2 和 3,v = {1, 4, 5}
// it 指向 4

remove()?

用于刪除容器當中特定值的元素

list<int> list1 = { 1, 2, 3, 4,3, 3 };
lt.remove(3); //刪除容器當中所有值為3的元素
// list1 { 1, 2, 4 }

remove_if()??

用于刪除容器當中滿足條件的元素。

bool single_digit(const int& val)
{return val < 10;
}list<int> list1 = { 1, 2, 3, 4,3, 3, 10 };
lt.remove_if(single_digit); / /刪除容器當中值小于10的元素
// list1 { 10 }

?unique()??

用于刪除容器當中連續的重復元素。?

list<int> list1 = { 1, 4 ,3 ,3, 2, 2, 3 };
list1.sort();     //將容器當中的元素排為升序
list1.unique();     //刪除容器當中連續的重復元素
// list1 { 1, 2, 3, 4 }

clear()

移除所有元素,size()?變為 0

list<int> mylist = { 1, 2, 3 };
mylist.clear();    // mylist.size() == 0

list的拼接

splice()

可以將一個鏈表的元素移動到另一個鏈表中,無需復制元素。

示例一:合并整個鏈表

    list<int> list1 = {1, 2, 3};list<int> list2 = {4, 5, 6};// 將 list2 的所有元素移動到 list1 的末尾list1.splice(list1.end(), list2);// 輸出結果: 1 2 3 4 5 6for (auto num : list1) {std::cout << num << " ";}

示例 2: 移動單個元素

list<int> list1 = {1, 2, 3};
list<int> list2 = {4, 5, 6};// 將 list2 的第一個元素移動到 list1 的末尾
auto it = list2.begin();
list1.splice(list1.end(), list2, it);    // list1{ 1, 2, 3 , 4 }

示例 3: 移動元素區間?

list<int> list1 = {1, 2, 3};
list<int> list2 = {4, 5, 6};// 將 list2 中從第二個元素到末尾的元素移動到 list1 的末尾
auto start = list2.begin();
start++;
auto end = list2.end();
list1.splice(list1.end(), list2, start, end);    
// list1 { 1, 2, 3, 5, 6 }

merge()

如果兩個鏈表已排序,可以用?merge()?合并并保持有序:

std::list<int> list1 = {1, 3, 5};
std::list<int> list2 = {2, 4, 6};// 合并后 list2 變為空,list1 包含 1 2 3 4 5 6
list1.merge(list2);

list的迭代器

迭代器類型

迭代器類型說明示例
iterator可讀寫的正向迭代器list.begin()
const_iterator只讀的正向迭代器list.cbegin()
reverse_iterator可讀寫的反向迭代器list.rbegin()
const_reverse_iterator只讀的反向迭代器list.crbegin()

begin()和end()

  • begin():返回指向第一個元素的迭代器。

  • end():返回指向最后一個元素之后位置的迭代器(尾后迭代器)。

    list<int> lt(10, 2);//正向迭代器遍歷容器list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}

rbegin()和rend()

  • rbegin():返回指向最后一個元素之后位置的迭代器(尾后迭代器)。

  • rend():返回指向第一個元素的迭代器。

    list<int> lt(10, 2);//反向迭代器遍歷容器list<int>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){cout << *rit << " ";rit++;}

支持的運算符

  • ++it?和?it++:向前移動

  • --it?和?it--:向后移動

  • *it:解引用獲取元素值

  • it1 == it2?和?it1 != it2:比較是否指向同一位置

不支持的運算符

  • it + n?或?it[n](不支持隨機訪問)

  • it1 < it2(僅支持相等性比較)

?

list中的元素訪問

front()

獲取list容器第一個元素

    list<int> lt = { 0, 1, 2, 3, 4 };cout << lt.front() << endl; //0

back()

獲取list容器最后一個元素

   list<int> lt = { 0, 1, 2, 3, 4 };cout << lt.back() << endl; //4

list的逆置

reverse()

list<int> list1 = { 1, 2, 3, 4, 5 };list1.reverse();
// list1 { 5, 4, 3, 2, 1 }  

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

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

相關文章

【數據結構】(11) Map 和 Set

一、Map 和 Set 的簡介 1、Set 和 Map Map 和 Set 是集合類框架學習的最后一部分。Map 和 Set 都是接口&#xff0c;需要通過 TreeSet、HashSet 和 TreeMap、HashMap 實例化。注意&#xff0c;Set 實現了 Collection&#xff0c;Map 并沒有。 Set 存放的是鍵&#xff08;Key&a…

關于CanvasRenderer.SyncTransform觸發調用的機制

1&#xff09;關于CanvasRenderer.SyncTransform觸發調用的機制 2&#xff09;小游戲Spine裁剪掉幀問題 3&#xff09;Dedicated Server性能問題 4&#xff09;.mp4視頻放入RT進行渲染的性能分析閉坑指南 這是第421篇UWA技術知識分享的推送&#xff0c;精選了UWA社區的熱門話題…

Kronecker分解(K-FAC):讓自然梯度在深度學習中飛起來

Kronecker分解&#xff08;K-FAC&#xff09;&#xff1a;讓自然梯度在深度學習中飛起來 在深度學習的優化中&#xff0c;自然梯度下降&#xff08;Natural Gradient Descent&#xff09;是一個強大的工具&#xff0c;它利用Fisher信息矩陣&#xff08;FIM&#xff09;調整梯度…

【HTML— 快速入門】HTML 基礎

準備工作 vscode下載 百度網盤 Subline Text 下載 Sublime Text下載 百度網盤 vscode 下載 Sublime Text 是一款輕量好用的文本編輯器&#xff0c;我們在寫前端代碼時&#xff0c;使用 Sublime Text 打開比使用記事本打開&#xff0c;得到的代碼體驗更好&#xff0c;比 vscode…

鴻蒙開發深入淺出01(基本環境搭建、頁面模板與TabBar)

鴻蒙開發深入淺出01&#xff08;基本環境搭建、頁面模板與TabBar&#xff09; 1、效果展示2、下載 DevEco Studio3、創建項目4、新建頁面模板5、更改應用信息6、新建以下頁面7、Index.ets8、真機運行9、圖片資源文件 1、效果展示 2、下載 DevEco Studio 訪問官網根據自己的版本…

自動駕駛泊車算法詳解(一)

自動駕駛泊車算法是自動駕駛技術中的重要組成部分&#xff0c;主要用于實現車輛在復雜場景下的自動泊車功能&#xff08;如垂直泊車、側方位泊車、斜列泊車等&#xff09;。其核心目標是通過感知、規劃和控制技術&#xff0c;使車輛在無人工干預的情況下安全、高效地完成泊車動…

鴻蒙next 點擊穿透實現

點擊穿透可以參考華為開發的保留文章,該章節只能在developer preview版本下查看 點擊穿透 主要的方法是hitTestBehavior // xxx.ets Entry Component struct HitTestBehaviorExample {build() {// outer stackStack() {Button(outer button).onTouch((event) > {console.i…

27.[前端開發-JavaScript基礎]Day04-函數基本使用-遞歸-變量作用域-函數式編程

一、JavaScript函數 1 認識JavaScript函數 程序中的foo、bar、baz 認識函數 函數使用的步驟 2 函數的聲明和調用 聲明和調用函數 函數的參數 有參數的函數練習 函數的返回值 函數的練習 arguments參數&#xff08;JS高級再學習&#xff09; 3 函數的遞歸調用 函數中調用函數…

藍橋杯練習代碼

一、最長公共前綴 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴,返回空字符串 ""。 示例 1: 輸入:strs = ["flower","flow","flight"] 輸出:"fl"示例 2: 輸入:strs = ["dog",&q…

添加成對約束后的標簽傳播算法研究:使用Python語言編寫算法,在空手道數據集下驗證算法的準確性,在一定程度上解決非對齊問題

背景&#xff1a; 輔導的過程中遇到了一個比較新穎的問題&#xff0c;下面是我對這個問題的分析和簡要思路介紹。 思路分析&#xff1a; 這算機器學習下面的無監督學習&#xff0c;標簽傳播算法簡稱LPA&#xff0c;傳統的標簽傳播算法會出現非對齊問題&#xff0c;一句話描述就…

鴻蒙開發第4篇__關于在鴻蒙應用中使用Java語言進行設計

本博文很重要 HarmonyOS從 API8 開始不再支持使用Java作為開發語言&#xff0c;未來的新功能將在ArkTS中實現. API 8對應的是HarmonyOS 3.0.0版本。請看下圖&#xff1a; 因此&#xff0c; 讀者如果看到類似《鴻蒙應用程序開發》(2021年版本 清華大學出版計)書 還使用Java語言…

sklearn機器學習 Python代碼通用模板

以下是一個使用 scikit-learn&#xff08;sklearn&#xff09;進行機器學習的通用 Python 代碼模板。這個模板涵蓋了數據加載、預處理、模型訓練、評估和預測的基本流程&#xff0c;適用于常見的機器學習任務。 python # 導入必要的庫 import numpy as np import pandas as …

P9420 [藍橋杯 2023 國 B] 雙子數--最高效的質數篩【埃拉托斯特尼篩法】

P9420 [藍橋杯 2023 國 B] 雙子數 題目 分析代碼 題目 分析 首先&#xff0c;我們如何找到雙子數&#xff1f; 1&#xff09;找到所有質數滿足范圍內的質數&#xff08;即至少質數^2<23333333333333) 我們看見雙子數x的范圍2333<x<23333333333333&#xff0c;又因為…

deepseek 導出導入模型(docker)

前言 實現導出導入deepseek 模型。deepseek 安裝docker下參考 docker 導出模型 實際生產環境建議使用docker-compose.yml進行布局&#xff0c;然后持久化ollama模型數據到本地參考 echo "start ollama" docker start ollama#壓縮容器內文件夾&#xff0c;然后拷貝…

mysql有索引但是查詢沒有使用索引是什么問題

關鍵原因分析 索引選擇性問題 如果 order_id 沒有索引&#xff0c;即使 insert_time 有索引&#xff0c;優化器可能認為先通過 order_id 過濾數據更高效。但由于 order_id 無索引&#xff0c;只能全表掃描后過濾。即使 insert_time 有索引&#xff0c;如果滿足 insert_time >…

【Qt】為程序增加閃退crash報告日志

背景 隨著軟件代碼量的增加&#xff0c;軟件崩潰閃退的肯能行越來越大&#xff0c;其中一些是難以復現的&#xff0c;比如訪問了訪問了非法地址、被操作系統殺死等。 為此&#xff0c;在軟件出現閃退情況時&#xff0c;盡可能多的記錄閃退發生時信息&#xff0c;對排查閃退原…

C#從入門到精通(35)—如何防止winform程序因為誤操作被關閉

前言: 大家好,我是上位機馬工,碩士畢業4年年入40萬,目前在一家自動化公司擔任軟件經理,從事C#上位機軟件開發8年以上!我們在開發的上位機軟件運行起來以后,一般在右上角都有一個關閉按鈕,正常情況下點擊關閉按鈕就能關閉軟件,但是不排除我們不想關閉軟件,但是因為不…

ffmpeg avdevice_register_all 注冊設備的作用

在 FFmpeg 中&#xff0c;avdevice_register_all() 是一個用于注冊所有輸入和輸出設備的函數。它是 FFmpeg 的 libavdevice 模塊的一部分&#xff0c;專門用于處理音頻和視頻的輸入/輸出設備&#xff08;如攝像頭、麥克風、屏幕捕獲等&#xff09;。 以下是對 avdevice_regist…

[RH342]tcpdump

[RH342]tcpdump 1. 題目2. 解題 1. 題目 服務器serverc 和 servera 之間有進程定期發送一個明文密碼,找出它2. 解題 找出通信端口 抓包分析 tcpdump -X -vv port 6644紅框中就是密碼,所以密碼是root123

連接Sql Server時報錯無法通過使用安全套接字層加密與 SQL Server 建立安全連接

文章目錄 一. 前言二. 解決方案 方案1方案2 三. 總結 一. 前言 在《數據庫原理》這門課的實驗上&#xff0c;需要使用SQL Server&#xff0c;然后使用jdbc連接sql server突然報錯為&#xff1a;SQLServerException: “Encrypt”屬性設置為“true”且 “trustServerCertific…