STL——list用法總結
頭文件
#include<list>
聲明一個int型的list:list<int> a;
1、list的構造函數
list<int>a{1,2,3} list<int>a(n) //聲明一個n個元素的列表,每個元素都是0 list<int>a(n, m) //聲明一個n個元素的列表,每個元素都是m list<int>a(first, last) //聲明一個列表,其元素的初始值來源於由區間所指定的序列中的元素,first和last是叠代器
2、begin()和end()
通過調用list容器的成員函數begin()得到一個指向容器起始位置的iterator,可以調用list容器的end()函數來得到list末端下一位置
3、push_back()和push_front()
使用list的成員函數push_back和push_front插入一個元素到list中。其中push_back()是從list的末端插入,而push_front()是從list的頭部插入。
4、empty()
判斷list是否為空
5、resize()
調用resize(n)將list的長度改為只容納n個元素,超出的元素將被刪除。如果n比list原來的長度長,那麽默認超出的部分元素置為0。也可以用resize(n, m)的方式將超出的部分賦值為m。
例子:
list<int>b{1, 2, 3, 4}; b.resize(2); list中輸出元素:1,2 list<int>b{1, 2, 3, 4}; b.resize(6); list中輸出元素:1,2,3,4,0,0 list<int>b{1, 2, 3, 4}; b.resize(6,9); list中輸出元素:1,2,3,4,9,9
6、clear()
清空list中的所有元素
7、front()和back()
通過front()可以獲得list容器中的頭部元素,通過back()可以獲得list容器的最後一個元素。註意:當list元素為空時,這時候調用front()和back()不會報錯。因此在編寫程序時,最好先調用empty()函數判斷list是否為空,再調用front()和back()函數。
8、pop_back()和pop_front()
使用pop_back()可以刪掉尾部第一個元素,pop_front()可以刪掉頭部第一個元素。註意:list必須不為空,如果當list為空的時候調用pop_back()和pop_front()會使程序崩掉。
9、assign()
有兩種使用情況:
(1)a.assign(n, val):將a中的所有元素替換成n個val元素
例如:
list<int>b{1,2,3,4,5}; b.assign(5,10);
b中的元素變為10, 10, 10, 10, 10
(2)a.assign(b.begin(), b.end())
list<int>a{6,7,8,9}; list<int>b{1,2,3,4,5}; b.assign(a.begin(),a.end());
b中的元素變為6,7,8,9
10、swap()
交換兩個鏈表。a.swap(b)和swap(a, b),都可以完成a鏈表和b鏈表的交換。
例子:
list<int>a{6,7,8,9}; list<int>b{1,2,3,4,5}; swap(a, b); //或a.swap(b)
a中元素變為1,2,3,4,5
b中元素變為6,7,8,9
11、reverse()
可以實現list的逆置
例子:
list<int>b{1,2,3,4,5}; reverse(b.begin(),b.end());
b中元素變為5,4,3,2,1
12、merge()
a.merge(b) 調用結束後b變為空,a中元素包含原來a和b的元素。
例子:
list<int>a{6,7,8,9}; list<int>b{2, 1, 3, 6, 5}; a.merge(b,greater<int>());
a中元素變為:6,7,8,9,2,1,3,6,5
list<int>a{6,7,8,9}; list<int>b{2, 1, 3, 6, 5}; a.merge(b);
a中元素變為:2,1,3,6,5,6,7,8,9
13、insert()
在指定位置插入一個或多個元素
a.insert(a.begin(),100); //在a的開始位置(即頭部)插入100 a.insert(a.begin(),2, 100); //在a的開始位置插入2個100 a.insert(a.begin(),b.begin(), b.end());//在a的開始位置插入b從開始到結束的所有位置的元素
14、erase()
刪除一個元素或一個區域的元素
a.erase(a.begin()); //將a的第一個元素刪除 a.erase(a.begin(),a.end()); //將a的從begin()到end()之間的元素刪除。
15、remove()函數
從list中刪除元素
list<int>a{6,7,8,9,7,10}; a.remove(7);
刪除了a中所有值為7的元素,此時a中元素為6,8,9,10
16、remove_if()函數
括號中可以傳入
(1)回調函數
回調函數的原型為boolisRemove(T &obj1);
函數名任意,如果obj1需要被移除則返回1,否則返回0
使用方法:list.remove_if(isRemove)
這種方法最簡單,但是無法向回調函數中傳遞參數,每一個條件就要有一個回調函數,因此不推薦使用
(2)創建用於比較的類,傳入類名及初始化參數
用於比較的類必須重載bool operator()(T &obj1)方法,如果obj1需要被移除則返回1,否則返回0.
用於比較的類還應當包含必要的構造函數,用於傳遞參數。
使用方法:list.remove_if(classname(args))
例1:
bool is_odd(constint& value) { return (value == 4); } int main() { list<int> a{ 6,7,4,9,7,10 }; a.remove_if(is_odd); list<int>::iterator it = a.begin(); while (it != a.end()) { cout << *it << " "; it++; } return 0; }
輸出:
6 7 9 7 10
例2:
class single_digit { public: bool operator()(const int& value) { return (value<10); } }; int main() { list<int> a{ 6,7,4,9,7,10 }; a.remove_if(single_digit()); list<int>::iterator it = a.begin(); while (it != a.end()) { cout << *it << " "; it++; } return 0; }
輸出:
10
後記:其實list和vector很多操作都是差不多的,list和vector的底層實現分別是鏈表和順序表,操作起來也跟鏈表和順序表類似,list不能隨機存取,但是vector插入操作很費時
STL——list用法總結