.
💓 博客主頁:倔強的石頭的CSDN主頁 📝Gitee主頁:倔強的石頭的gitee主頁 ? 文章專欄:《C++指南》 期待您的關注
文章目錄 一、初識list容器 1.1 什么是list? 1.2 核心特性 1.3 典型應用場景 二、核心成員函數 三、迭代器操作 3.1 基礎迭代器 3.2 常量迭代器(C++11) 四、容量與訪問操作 五、修改操作詳解 5.1 基礎修改函數 5.2 高級修改操作 5.3 插入與刪除 六、特殊成員函數 七、總結與進階
一、初識list容器
1.1 什么是list?
在C++標準模板庫(STL)中,list
是一個基于雙向鏈表實現的序列容器。它允許在任意位置進行高效插入和刪除操作,時間復雜度為O(1)。與vector不同,list不保證元素在內存中的連續存儲,因此不支持隨機訪問。
1.2 核心特性
雙向鏈表結構 :每個元素包含指向前后節點的指針動態內存分配 :元素按需分配內存高效插入刪除 :無需移動其他元素迭代器穩定性 :插入刪除操作不會使已有迭代器失效(除被刪除元素)
1.3 典型應用場景
需要頻繁在首尾之外的位置插入/刪除元素 元素體積較大,避免vector擴容時的拷貝開銷 需要維護元素的插入順序 需要合并、拆分鏈表等特殊操作
二、核心成員函數
2.1 默認成員函數
構造函數的重載版本
函數 功能描述 示例 默認構造函數 創建空list list<int> lst1;
填充構造函數 創建包含n個元素的list list<char> lst2(5);
拷貝構造函數 復制另一個list的內容 list<int> lst3(lst2);
移動構造函數 (C++11)轉移另一個list的資源 list<int> lst4(move(lst3));
析構函數 自動釋放內存(通常無需手動調用) lst1.~list();
拷貝賦值運算符 深拷貝賦值操作 lst2 = lst1;
移動賦值運算符 (C++11)高效轉移資源賦值操作 lst3 = move(lst2);
list< string> fruits { "apple" , "banana" , "cherry" } ;
三、迭代器操作
3.1 基礎迭代器
函數 功能 示例 begin()
返回指向第一個元素的迭代器 auto it = lst.begin();
end()
返回末尾哨兵迭代器 while(it != lst.end())
rbegin()
返回反向起始迭代器 auto rit = lst.rbegin();
rend()
返回反向結束迭代器 for(; rit != lst.rend();)
3.2 常量迭代器(C++11)
函數 功能 示例 cbegin()
返回不可修改的正向起始迭代器 auto cit = lst.cbegin();
cend()
返回不可修改的正向結束迭代器 if(cit == lst.cend())
crbegin()
返回不可修改的反向起始迭代器 auto crit = lst.crbegin();
crend()
返回不可修改的反向結束迭代器 while(crit != lst.crend())
list< int > nums { 1 , 2 , 3 } ;
for ( auto it = nums. begin ( ) ; it != nums. end ( ) ; ++ it) { cout << * it << " " ;
}
四、容量與訪問操作
4.1 容量查詢
函數 功能 示例 size()
返回元素數量 if(lst.size() > 5)
empty()
判斷容器是否為空 while(!lst.empty())
4.2 元素訪問
函數 功能 示例 front()
訪問首元素(可修改) lst.front() = 10;
back()
訪問尾元素(可修改) cout << lst.back();
list< double > temps { 36.5 , 37.1 , 38.0 } ;
temps. front ( ) = 35.9 ;
cout << "當前體溫:" << temps. back ( ) ;
五、修改操作詳解
5.1 基礎修改函數
函數 功能 示例 push_front(val)
頭部插入元素 lst.push_front(0);
emplace_front(args)
頭部直接構造元素 lst.emplace_front("test");
pop_front()
刪除頭部元素 lst.pop_front();
push_back(val)
尾部插入元素 lst.push_back(100);
emplace_back(args)
尾部直接構造元素 lst.emplace_back(1,2);
pop_back()
刪除尾部元素 lst.pop_back();
clear()
清空所有元素 lst.clear();
push_back vs emplace_back :
class Student {
public : Student ( int id, string name) : id ( id) , name ( name) { }
private : int id; string name;
} ; list< Student> roster;
roster. push_back ( Student ( 101 , "Alice" ) ) ;
roster. emplace_back ( 102 , "Bob" ) ;
5.2 高級修改操作
函數 功能 示例 assign(n, val)
用n個val替換內容 lst.assign(5, 0);
assign(beg, end)
用迭代器范圍替換內容 lst.assign(vec.begin(), vec.end());
swap(other)
交換兩個list的內容 lst1.swap(lst2);
resize(n)
調整元素數量 lst.resize(10);
resize(n, val)
調整數量并用val填充新增元素 lst.resize(15, -1);
list< int > nums;
nums. assign ( { 1 , 2 , 3 } ) ;
nums. resize ( 5 ) ;
nums. resize ( 3 ) ;
5.3 插入與刪除
insert重載版本
iterator insert ( iterator pos, const T& val) ;
void insert ( iterator pos, size_t n, const T& val) ;
void insert ( iterator pos, InputIt first, InputIt last) ;
erase操作
iterator erase ( iterator pos) ;
iterator erase ( iterator first, iterator last) ;
示例 :
list< int > data { 10 , 20 , 30 } ;
auto it = data. begin ( ) ;
advance ( it, 1 ) ; data. insert ( it, 15 ) ;
data. insert ( it, 2 , 18 ) ;
vector< int > tmp { 25 , 35 } ;
data. insert ( data. end ( ) , tmp. begin ( ) , tmp. end ( ) ) ; data. erase ( it) ;
六、特殊成員函數
6.1 條件操作
函數 功能 示例 remove(val)
刪除所有等于val的元素 lst.remove(5);
remove_if(pred)
刪除滿足條件的元素 lst.remove_if([](int n){ return n%2==0; });
list< int > nums { 1 , 2 , 3 , 2 , 5 } ;
nums. remove ( 2 ) ;
nums. remove_if ( [ ] ( int x) { return x> 3 ; } ) ;
6.2 鏈表特有操作
函數 功能 示例 unique()
刪除連續重復元素 lst.unique();
merge(other)
合并有序鏈表 lst1.merge(lst2);
sort()
排序元素(升序) lst.sort();
splice(pos, other)
轉移另一個鏈表的元素 lst1.splice(it, lst2);
list< int > a { 1 , 3 , 5 } , b { 2 , 4 , 6 } ;
a. merge ( b) ;
a. sort ( ) ; list< int > x { 10 , 20 } , y { 30 , 40 } ;
auto pos = x. begin ( ) ;
x. splice ( pos, y) ;
七、總結與進階
本文詳細介紹了C++ list容器的基本特性和使用方法。通過大量的代碼示例,我們學習了如何正確使用list進行元素的增刪改查操作。list作為STL中重要的序列式容器,其獨特的鏈表結構使其在特定場景下具有不可替代的優勢。
在接下來的系列文章中,我們將深入探討:
list的高級應用技巧 list在實際項目中的最佳實踐案例
下篇預告 :《【C++指南】C++ list容器完全解讀(二):list模擬實現,底層架構揭秘》,我們將通過剖析STL源碼實現,帶你理解list的底層工作機制