STL標準模板庫是容器和算法組成的。
1,所有容器
(1)數組 array 向量 vector
(2)棧 stack
(3)隊列 queue 優先隊列 priority_queue 雙端隊列 deque
(4)鍵值對集合 map multimap unordered_map unordered_multimap
(5)集合 set multiset unordered_set unordered_multiset
(6)鏈表 list forward_list
2,常用容器
(1)順序容器
鏈表 list 向量 vector 雙端隊列 deque
(2)關聯容器
set multiset unordered_set
map unordered_map
(3)容器適配器
棧 stack 隊列 queue 優先隊列 priority_queue
3,容器主要用法
(1)順序容器
鏈表 list 向量 vector 雙端隊列 deque
(2)關聯容器
set multiset unordered_set
map unordered_map
PS:contains是C++20的新函數
(3)容器適配器
棧 stack 隊列 queue 優先隊列 priority_queue
4,resize和reserve
vector<int>v(3);
cout<<v.size();
v.reserve(5);
cout<<v.size();
v.resize(5);
cout<<v.size();
輸出:3 3 5
這說明,reserve是預留空間,但是並不在容器中,而是在容器外,而resize是直接往容器中擴充了空間。
之所以要預留空間,是因爲vector是動態大小,如果插入次數較多,就會涉及到多次的整體搬運內存,效率變得很低。
5,sort函數
只有順序容器可以排序,關聯容器和容器適配器不能排序。
常用順序容器: 鏈表 list 向量 vector 雙端隊列 deque
鏈表排序是用成員sort函數,其他順序容器是用STL中sort函數,因爲鏈表是不連續的內存,其他順序容器是連續內存。
(1)STL中的sort函數
參考 C++中的 sort函數、函數指針、仿函數 https://blog.csdn.net/nameofcsdn/article/details/104823002
2個必選參數:begin和end,1個可選參數:比較函數
默認升序(相當於less<>()),也可以用函數指針,包括greater<>()、less<>()、自定義函數指針、自定義仿函數
(2)list的成員sort函數
1個可選參數:比較函數
默認升序(相當於less<>()),也可以用函數指針,包括greater<>()、less<>()、自定義函數指針,不能用自定義仿函數
(3)優先隊列priority_queue
優先隊列priority_queue、仿函數 https://blog.csdn.net/nameofcsdn/article/details/104831555
優先隊列在定義時需要內置比較函數,和list的成員sort函數一樣:
默認升序(相當於less<>()),也可以用函數指針,包括greater<>()、less<>()、自定義函數指針,不能用自定義仿函數
小結:所有排序都是默認是less函數,優先隊列是以end 作爲top,所以默認升序函數就是默認大頂堆。
6,find函數
順序容器採用STL中的find函數,而關聯容器採用成員find函數。
用法差不多,返回搜索結果的迭代器,搜索不到返回end,find使用的== 可以重載,即自定義查找條件。
(1)STL中的find函數
常用順序容器: 鏈表 list 向量 vector 雙端隊列 deque
list<int>l;
l.push_back(1);
auto it = find(l.begin(),l.end(),8);
if(it==l.end())cout<<"not";
else cout<<"yes";
雖然鏈表不是連續內存,但是迭代器可以++,基於此鏈表可以和連續內存一樣進行搜索。
(2)關聯容器的成員find函數
set<int>s;
s.insert(1);
auto it = s.find(1);
if(it==s.end())cout<<"not";
else cout<<"yes";
PS:對於multi開頭的關聯容器,據說是返回第一個進入容器的那一個。
7,lower_bound、upper_bound、equal_range
//未完待續
8,copy函數