list功能介紹
c++中list是使用雙向鏈表實現的一個容器,這個容器可以實現。插入,刪除等的操作。與vector相比,vector適合尾插和尾刪(vector的實現是使用了動態數組的方式。在進行頭刪和頭插的時候后面的數據會進行挪動,時間復炸度為O(N)),但是list更適合在任意位置的插入和刪除。因為在要更改的位置進行節點的指向更改就可以插入數據。
在list中插入了6 ,但是的話在空間中沒有改變數據的位置,只是改變了指向。這個時候時間復雜度為常數。
list的總要接口
list構造
構造函數(c++11增加了其他的構造函數,在這暫且不講,可自行鏈接查詢 list
默認構造函數
構建一個空鏈表
list (const allocator_type& alloc = allocator_type());
代碼示例:
#include<list>
#include<iostream>list<int> mytest; //調用默認構造函數
填充構造函數
構造一個具有 n 個元素的鏈表,每個元素的值都是 val。
list (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());
示例:
#include<list>
#include<iostream>list<int> mytest1; //調用默認構造函數
list<int> mytest2(13,7); //13個元素,每個元素是7
范圍構造器
使用迭代器構造一個list對象
list (InputIterator first, InputIterator ,const allocator_type& alloc = allocator_type());
示例:
#include<list>
#include<iostream>list<int> mytest1; //調用默認構造函數
list<int> mytest2(13,7); //13個元素,每個元素是7
list<int> mytest3(mytest2.begin(),mytest2.begin()+5); //使用mytest.2對mytest3進行初始化
拷貝構造函數
list (const list& x);
示例:
#include<list>
#include<iostream>list<int> mytest1; //調用默認構造函數
list<int> mytest2(13,7); //13個元素,每個元素是7
list<int> mytest3(mytest2.begin(),mytest2.begin()+5); //使用mytest.2對mytest3進行初始化
list<int> mytest4(mytest3);//把mytest3拷貝給mytest4
capacity
函數聲明和接口說明:
empty:檢測list是否為空,如果為空,如果為空返回true,不為空返回false
size:返回對象中數據的個數
element access
函數聲明和接口說明:
front:返回list中第一個元素
back:返回list中最后一個數據
modifiers
函數聲明和接口說明:
push_front:在鏈表第一個位置進行頭插
pop_front:刪除鏈表第一個位置
push_back:在list尾部進行尾插
pop_back:刪除尾部數據
insert:在list pos位置處進行數據插入
erase:刪除list中pos的數據
swap:兩個list對象進行交換
clear: 清空list中有效數據
注意:改文檔只展示了常用list對象,若需要進行更多函數的學習可參考list文檔
list迭代器失效問題
在C++中,list容器是一個雙向鏈表,因此對它的插入和刪除操作不會像vector那樣導致整體內存拷貝,但是list的迭代器在某些操作中仍然會失效。
一、會導致迭代器失效的操作
-
刪除元素(erase):
- 刪除某個元素會使指向該元素的迭代器失效。
- 其他迭代器仍然有效。
std::list<int> lst = {1, 2, 3, 4}; auto it = lst.begin(); // 指向1 it = lst.erase(it); // it指向被刪除的元素1,失效,需要使用返回值更新it // 此時it指向2
-
splice操作中目標位置的迭代器不失效,但被轉移的元素的迭代器可能失效。
二、安全的迭代方式
使用返回值來更新迭代器,防止因刪除導致的失效:
for (auto it = lst.begin(); it != lst.end(); ) {if (*it % 2 == 0) {it = lst.erase(it); // 刪除并更新迭代器} else {++it;}
}
三、總結
- list的插入不會使其他迭代器失效。
- list的刪除操作會使被刪除元素的迭代器失效。
- 修改容器結構時,應小心處理返回值,確保不會訪問失效的迭代器。
list的模擬實現
因為list的模擬實現代碼篇幅長度較大,所有在這我展示我list模擬實現的gitee倉庫,大家可進行訪問和探討,歡迎在評論區指出本文檔錯誤
list的模擬實現