【STL】list介紹(附與vector的比較)

文章目錄

  • 1.關于list
  • 2.使用
    • 2.1 list的構造
    • 2.2 list 迭代器的使用
    • 2.3 list 容量操作
      • 2.3.1 size()
      • 2.3.2 empty()
      • 2.3.3 resize()
    • 2.4 list 元素訪問
      • 2.4.1 front()
      • 2.4.2 back()
    • 2.5 list 修改操作
      • 2.5.1 push_front()
      • 2.5.2 pop_front()
      • 2.5.3 push_back()
      • 2.5.4 pop_back()
      • 2.5.5 insert()
      • 2.5.6 erase()
      • 2.5.7 swap()
      • 2.5.8 clear()
    • 2.6其它
      • 2.6.1 remove()
      • 2.6.2 remove_if()
      • 2.6.3 unique()
      • 2.6.4 sort()
      • 2.6.5 merge()
      • 2.6.6 reverse()
  • 3. vector和list對比

1.關于list

? list也是STL提供的一個容器,其底層是一個帶頭雙向循環鏈表,因此,其優缺點如下:

優點:

  1. 插入和刪除效率高:在鏈表的任意位置插入或刪除元素的時間復雜度為 O (1),這使得list在需要頻繁插入和刪除元素的場景下非常高效。
  2. 內存管理靈活list的元素在內存中不是連續存儲的,因此可以靈活地分配和釋放內存,避免了內存碎片的問題。

缺點:

  1. 隨機訪問效率低:由于list是雙向鏈表,不支持隨機訪問,要訪問第 n 個元素,需要從頭或尾開始遍歷鏈表。
  2. 空間開銷大:每個元素除了存儲自身的數據外,還需要額外的指針來指向前一個和后一個元素,因此空間開銷較大。

在這里插入圖片描述

2.使用

? 這里也只介紹常用的一些接口。

2.1 list的構造

1.聲明及說明

構造函數聲明說明
list(size_type n,const value_type& val = value_type())構造包含n個val元素的list
list()構造空的list
list(const list& x)拷貝構造
list (InputIterator ?rst, InputIterator last)[first,last)區間元素構造

2.示例

#include <iostream>
#include <list> //注意包含頭文件<list>
using namespace std;template <class T>
void print_list(list<T>& lt)
{for (auto& e : lt){cout << e << " ";}cout << endl;
}void list_test1()
{list<int> lt1;                         // 構造空的lt1list<int> lt2(5, 10);                 // 4個值為10的元素構造lt2list<int> lt3(lt2.begin(), lt2.end()); // 用lt2的[begin(), end())區間構造lt3list<int> lt4(lt3);                    // 用lt3拷貝構造lt4list<int> lt5{ 1,2,3,4,5 };           //列表格式構造 C++11支持print_list(lt1);//  print_list(lt2);//10 10 10 10 10print_list(lt3);//10 10 10 10 10print_list(lt4);//10 10 10 10 10print_list(lt5);//1 2 3 4 5
}int main()
{list_test1();return 0;
}

2.2 list 迭代器的使用

1.聲明及說明

聲明說明
begin() + end()返回第一個元素的迭代器+返回最后一個元素下一個位置的迭代器
rbegin() + rend()返回反向第一個元素的reverse_iterator,返回反向最后一個元素下一個位置的reverse_iterator

在這里插入圖片描述

2.示例

void list_test2()
{list<int> lt{ 1,2,3,4,5 };           //列表格式構造 C++11支持list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";++it;}cout << endl;//輸出:1 2 3 4 5list<int>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){cout << *rit << " ";++rit;}cout << endl;//輸出:5 4 3 2 1
}int main()
{list_test2();return 0;
}

2.3 list 容量操作

2.3.1 size()

1.聲明及功能

聲明功能
size_type size() const返回list內有效元素個數

2.示例

void list_test3()
{list<int> lt{ 1,2,3,4,5 };cout << lt.size() << endl;  //5
}int main()
{list_test3();return 0;
}

2.3.2 empty()

1.聲明及功能

聲明功能
bool empty() const檢測list是否為空

2.示例

void list_test4()
{list<int> lt1;list<int> lt2{ 1,2,3,4,5 };if (lt1.empty()){cout << "lt1 is empty" << endl;}else{cout << "lt1 is not empty" << endl;}//輸出:lt1 is emptyif (lt2.empty()){cout << "lt2 is empty" << endl;}else{cout << "lt2 is not empty" << endl;}//輸出:lt2 is not empty
}int main()
{list_test4();return 0;
}

2.3.3 resize()

1.聲明及功能

聲明功能
void resize (size_type n);將list的size調整為n。如果n大于當前list的size(),則在列表末尾插入默認構造的元素。如果n小于當前list的size(),則刪除超出n的元素。
void resize (size_type n, const value_type& val);將list的size調整為n。如果n大于當前列表的size(),則在列表末尾插入足夠數量的值為val的元素。如果n小于當前列表的大小,則刪除超出n的元素。

2.示例

void list_test5()
{list<int> lt1(5, 1);list<int> lt2(5, 2);print_list(lt1);//1 1 1 1 1print_list(lt2);//2 2 2 2 2lt1.resize(10, 2);print_list(lt1);//1 1 1 1 1 2 2 2 2 2lt1.resize(2, 0);print_list(lt1);//1 1lt2.resize(1);print_list(lt2);//2lt2.resize(10);print_list(lt2);//2 0 0 0 0 0 0 0 0 0 }int main()
{list_test5();return 0;
}

2.4 list 元素訪問

2.4.1 front()

1.聲明及功能

聲明功能
reference front();返回list第一個節點的值的引用

2.示例

void list_test6()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5++lt.front();//2 2 3 4 5print_list(lt);}
int main()
{list_test6();return 0;
}

2.4.2 back()

1.聲明及功能

聲明功能
reference back();返回list的最后一個節點中值的引用

2.示例

void list_test7()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5--lt.back();print_list(lt);//1 2 3 4 4}
int main()
{list_test7();return 0;
}

2.5 list 修改操作

2.5.1 push_front()

1.聲明及功能

聲明功能
void push_front (const value_type& val);在list首元素前插入值為val的元素

2.示例

void list_test8()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.push_front(0);print_list(lt);//0 1 2 3 4 5}
int main()
{list_test8();return 0;
}

2.5.2 pop_front()

1.聲明及功能

聲明功能
void pop_front();刪除list中第一個元素

2.示例

void list_test9()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5 lt.pop_front();print_list(lt);//2 3 4 5}
int main()
{list_test9();return 0;
}

2.5.3 push_back()

1.聲明及功能

聲明功能
void push_back (const value_type& val);在list尾部插入值為val的元素

2.示例

void list_test10()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);print_list(lt);//1 2 3 4 5
}
int main()
{list_test10();return 0;
}

2.5.4 pop_back()

1.聲明及功能

聲明功能
void pop_back();刪除list中最后一個元素

2.示例

void list_test11()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.pop_back();lt.pop_back();lt.pop_back();lt.pop_back();print_list(lt);//1}
int main()
{list_test11();return 0;
}

2.5.5 insert()

1.聲明及功能

聲明功能
iterator insert (iterator position, const value_type& val);在position位置前插入值為val的元素
void insert (iterator position, size_type n, const value_type& val);在position位置前插入n個值為val的元素
template < class InputIterator > void insert (iterator position, InputIterator first, InputIterator last);在position位置前插入指定區域[first,last)對應值的元素

2.示例

void list_test12()
{list<int> lt{ 1,2,3,4,5 };list<int> lt1{ 1,1,1,1,1 };print_list(lt);//1 2 3 4 5list<int>::iterator it = ++lt.begin();lt.insert(it, 0);print_list(lt);//1 0 2 3 4 5lt.insert(lt.begin(), 3, 0);print_list(lt);//0 0 0 1 0 2 3 4 5lt.insert(lt.begin(), lt1.begin(), lt1.end());print_list(lt);//1 1 1 1 1 0 0 0 1 0 2 3 4 5
}
int main()
{list_test12();return 0;
}

2.5.6 erase()

1.聲明及功能

聲明功能
iterator erase (iterator position);刪除position位置的值,并返回position下一個位置的iterator
iterator erase (iterator first, iterator last);刪除指定區間[first,last)的元素并返回last位置的iterator

在這里插入圖片描述

2.示例

void list_test13()
{list<int> lt{ 1,2,3,4,5,6,7,8,9,10 };print_list(lt);//1 2 3 4 5 6 7 8 9 10list<int>::iterator it1 = lt.begin();while (it1 != lt.end()){if (*it1 == 5){it1 = lt.erase(it1); //it指向值為6的位置cout << *it1 << endl;//6continue;}it1++;}print_list(lt);//1 2 3 4 5 7 8 9 10list<int>::iterator first = ++lt.begin();//指向2的位置list<int>::iterator last = --lt.end(); //指向10的位置list<int>::iterator it2 = lt.erase(first, last);//刪除[first,last) it2指向last的位置即9的位置cout << *it2 << endl;//10print_list(lt);//1 10
}
int main()
{list_test13();return 0;
}

2.5.7 swap()

1.聲明及功能

聲明功能
void swap (list& x);交換兩個list

2.示例

void list_test14()
{list<int> lt1{ 1,2,3,4,5 };list<int> lt2{ 5,4,3,2,1 };print_list(lt1);//1 2 3 4 5print_list(lt2);//5 4 3 2 1lt1.swap(lt2);print_list(lt1);//5 4 3 2 1print_list(lt2);//1 2 3 4 5
}
int main()
{list_test14();return 0;
}

2.5.8 clear()

1.聲明及功能

聲明功能
void clear();清空list中的有效元素(不包括頭節點)

2.示例

void list_test15()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.clear();print_list(lt);// 
}
int main()
{list_test15();return 0;
}

2.6其它

2.6.1 remove()

1.聲明及功能

聲明功能
void remove (const value_type& val);刪除值為val的元素

2.示例

void list_test16()
{list<int> lt{ 10,20,30,40,50 };print_list(lt);//10 20 30 40 50lt.remove(30);//有30則刪除print_list(lt);//10 20 40 50lt.remove(1);//無1則不刪除print_list(lt);//10 20 40 50}
int main()
{list_test16();return 0;
}

2.6.2 remove_if()

1.聲明及功能

聲明功能
template < class Predicate> void remove_if (Predicate pred);刪除滿足()中條件的值,其中可以是函數指針或者函數對象

2.示例

bool if_even(int n)
{return n % 2 != 0;
}void list_test17()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.remove_if(if_even);//刪除奇數print_list(lt);//2 4
}
int main()
{list_test17();return 0;
}

2.6.3 unique()

1.聲明及功能

聲明功能
void unique();刪除list中連續重復的值,一段連續值只保留一個(注意區分,不是完全去重)

2.示例

void list_test18()
{list<int> lt{ 1,1,1,2,2,2,3,3,4,5,5 };print_list(lt);//1 1 1 2 2 2 3 3 4 5 5 lt.unique();//連續重復的數,僅保留一個print_list(lt);//1 2 3 4 5 list<int> lt1{ 1,1,1,2,2,2,1,1,2,2,3,3,4,5,5 };print_list(lt1);1 1 1 2 2 2 1 1 2 2 3 3 4 5 5 lt1.unique();print_list(lt1);//1 2 1 2 3 4 5
}int main()
{list_test18();return 0;
}

2.6.4 sort()

1.聲明及功能

聲明功能
void sort();默認按升序排序
template < class Compare> void sort (Compare comp);按comp方法進行排序

2.示例

struct cmp
{bool operator()(int a,int b) {return a > b;}
};
void list_test19()
{list<int> lt{ 3,1,2,5,4,0,2 };print_list(lt);//3 1 2 5 4 0 2lt.sort();//默認升序排列print_list(lt);//0 1 2 2 3 4 5lt.sort(cmp());//自定義降序排列print_list(lt);//5 4 3 2 2 1 0
}
int main()
{list_test19();return 0;
}

2.6.5 merge()

1.聲明及功能

聲明功能
void merge (list& x);合并兩個list為一個有序的list(僅適用于兩個已排序的list(升序))

2.示例

void list_test20()
{list<int> lt1{ 1,2,6,4,5 };list<int> lt2{ 0,4,21,3,4 };lt1.sort();lt2.sort();lt1.merge(lt2);//將lt2合并到lt1中,合并成一個升序listprint_list(lt1);//0 1 2 3 4 4 4 5 6 21print_list(lt2);//
}
int main()
{list_test20();return 0;
}

2.6.6 reverse()

1.聲明及功能

聲明功能
void reverse();翻轉list

2.示例

void list_test21()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.reverse();print_list(lt);//5 4 3 2 1
}
int main()
{list_test21();return 0;
}

3. vector和list對比

對比vectorlist
底層結構動態順序表帶頭雙向循環鏈表
訪問支持隨機訪問,可使用首地址+下標,[]形式不能隨機訪問
插入刪除任意位置插入刪除效率較低,需挪動元素任意位置插入刪除效率較高
空間利用率底層為連續空間,空間利用率高,緩存利用率高節點動態開辟,容易造成內存碎片,空間利用率低,緩存利用率低
迭代器原生態指針指針進行了封裝
迭代器失效容器相關操作都可能導致迭代器失效,如插入引起擴容、刪除元素等時插入元素不會導致迭代器失效,刪除節點會導致且只影響當前迭代器
使用場景想進行隨機訪問,不關心插入刪除效率時有大量插入刪除場景,不在意隨機訪問效率時

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

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

相關文章

【Django】教程-12-柱狀圖

【Django】教程-1-安裝創建項目目錄結構介紹 【Django】教程-2-前端-目錄結構介紹 【Django】教程-3-數據庫相關介紹 【Django】教程-4-一個增刪改查的Demo 【Django】教程-5-ModelForm增刪改查規則校驗【正則鉤子函數】 【Django】教程-6-搜索框-條件查詢前后端 【Django】教程…

SQL:DDL(數據定義語言)和DML(數據操作語言)

目錄 什么是SQL&#xff1f; 1. DDL&#xff08;Data Definition Language&#xff0c;數據定義語言&#xff09; 2. DML&#xff08;Data Manipulation Language&#xff0c;數據操作語言&#xff09; DDL和DML的區別 什么是SQL&#xff1f; SQL&#xff08;Structured …

Chrome 135 版本開發者工具(DevTools)更新內容

Chrome 135 版本開發者工具&#xff08;DevTools&#xff09;更新內容 一、性能&#xff08;Performance&#xff09;面板改進 1. 性能面板中的配置文件和函數調用現已顯示來源和腳本鏈接 Performance > Summary&#xff08;性能 > 概覽&#xff09;選項卡現在會顯示配…

[ctfshow web入門] web23

前置知識 include&#xff1a;包含一個文件&#xff0c;也可以包含一些其他東西&#xff0c;后續用到再解析 substr&#xff1a;對字符串進行切片&#xff0c;第一個參數是字符串&#xff0c;第二第三個參數出從第a個索引開始切n個&#xff0c;索引從0開始計數。 例如&#xf…

vue3 開發電子地圖功能

文章目錄 一、項目背景二、頁面效果三、代碼1.ElectronicMap.vue2.TransferDeskRSSIMap.vue3.Map.js4.src/stores/index.js Vuex存儲屬性 四、注意點本人其他相關文章鏈接 一、項目背景 項目采用&#xff1a;vue3javaArco DesignSpringBootOpenStreetMap 數據的地圖切片服務。…

oracle 存儲體系結構

oracle 存儲體系結構 參考&#xff1a; Logical Storage Structures (oracle.com)

python-leetcode 66.尋找旋轉排序數組中的最小值

題目&#xff1a; 已知一個長度為n的數組&#xff0c;預先按照升序排列&#xff0c;經由1到n次旋轉后&#xff0c;得到輸入數組&#xff0c;例如&#xff0c;原數組 nums [0,1,2,4,5,6,7] 在變化后可能得到&#xff1a; 若旋轉 4 次&#xff0c;則可以得到 [4,5,6,7,0,1,2]若…

【MATLAB第113期】基于MATLAB的EFAST擴展傅里葉幅度敏感性分析方法(有目標函數)

【MATLAB第113期】基于MATLAB的EFAST擴展傅里葉幅度敏感性分析方法&#xff08;有目標函數&#xff09; 一、方法概述 擴展傅里葉幅度敏感性檢驗&#xff08;EFAST&#xff09;是一種基于頻域分析的全局敏感性分析方法&#xff0c;能夠同時評估模型參數的一階敏感性&#xff…

Tiktok 關鍵字 視頻及評論信息爬蟲(1) [2025.04.07]

&#x1f64b;?♀?Tiktok APP的基于關鍵字檢索的視頻及評論信息爬蟲共分為兩期&#xff0c;希望對大家有所幫助。 第一期見下文。 第二期&#xff1a;基于視頻URL的評論信息爬取 1. Node.js環境配置 首先配置 JavaScript 運行環境&#xff08;如 Node.js&#xff09;&#x…

【愚公系列】《高效使用DeepSeek》058-選題策劃

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…

零基礎教程:Windows電腦安裝Linux系統(雙系統/虛擬機)全攻略

一、安裝方式選擇 方案對比表 特性雙系統安裝虛擬機安裝性能原生硬件性能依賴宿主機資源分配磁盤空間需要獨立分區&#xff08;建議50GB&#xff09;動態分配&#xff08;默認20GB起&#xff09;內存占用獨占全部內存需手動分配&#xff08;建議4GB&#xff09;啟動方式開機選…

LeetCode 2968.執行操作使頻率分數最大

給你一個下標從 0 開始的整數數組 nums 和一個整數 k 。 你可以對數組執行 至多 k 次操作&#xff1a; 從數組中選擇一個下標 i &#xff0c;將 nums[i] 增加 或者 減少 1 。 最終數組的頻率分數定義為數組中眾數的 頻率 。 請你返回你可以得到的 最大 頻率分數。 眾數指的…

excel經驗

Q:我現在有一個excel&#xff0c;有一列數據&#xff0c;大概兩千多行。如何在這一列中 篩選出具有關鍵字的內容&#xff0c;并輸出到另外一列中。 A: 假設數據在A列&#xff08;A1開始&#xff09;&#xff0c;關鍵字為“ABC”在相鄰空白列&#xff08;如B1&#xff09;輸入公…

HTTP查詢參數示例(XMLHttpRequest查詢參數)(帶查詢參數的HTTP接口示例——以python flask接口為例)flask查詢接口

文章目錄 HTTP查詢參數請求示例接口文檔——獲取城市列表代碼示例效果 帶查詢參數的HTTP接口示例——以python flask接口為例app.pyREADME.md運行應用API示例客戶端示例關鍵實現說明&#xff1a;運行方法&#xff1a; HTTP查詢參數請求示例 接口文檔——獲取城市列表 代碼示例…

將飛帆制作的網頁作為 div 集成到自己的網頁中

并且自己的網頁可以和飛帆中的控件相互調用函數。效果&#xff1a; 上鏈接 將飛帆制作的網頁作為 div 集成到自己的網頁中 - 文貝 進入可以復制、運行代碼

Redis主從復制:告別單身Redis!

目錄 一、 為什么需要主從復制&#xff1f;&#x1f914;二、 如何搭建主從架構&#xff1f;前提條件?步驟&#x1f4c1; 創建工作目錄&#x1f4dc; 創建 Docker Compose 配置文件&#x1f680; 啟動所有 Redis&#x1f50d; 驗證主從狀態 &#x1f4a1; 重要提示和后續改進 …

k8s 1.30.6版本部署(使用canal插件)

#系統環境準備 參考 https://blog.csdn.net/dingzy1/article/details/147062698?spm1001.2014.3001.5501 #配置下載源 curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyri…

機器學習的一百個概念(7)獨熱編碼

前言 本文隸屬于專欄《機器學習的一百個概念》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見[《機器學習的一百個概念》 ima 知識庫 知識庫廣場搜索&…

RHCSA復習

在Linux中&#xff0c; wrx 分別代表寫&#xff08;write&#xff09;、讀&#xff08;read&#xff09;和執行&#xff08;execute&#xff09;權限&#xff0c;它們對應的權限值分別是&#xff1a; - r &#xff08;讀權限&#xff09;&#xff1a;權限值為4。 - w &am…

“樂企“平臺如何重構業財稅票全流程生態?

2025年&#xff0c;國家稅務總局持續推進的"便民辦稅春風行動"再次推進數字化服務升級&#xff0c;其中"樂企"平臺作為稅務信息化的重要載體&#xff0c;持續優化數電票服務能力&#xff0c;為企業提供更高效、更規范的稅務管理支持。在這一背景下&#xf…