又爱又恨的STL
又愛又恨的STL:
文章目錄
- 又愛又恨的STL:
- STL(標準模板庫)
- 容器:
- vector-變長數組
- set-內部自動有序且不含重復元素
- string-字符串
- map-鍵值對(key-value)
- queue-隊列
- priority_quque-優先隊列(自動排序的隊列)
- stack-棧
- pair-對
- 算法
- sort()與stable_sort()
- random_shuffle()
- lower_bound()與upper_bound()
- next_permutation()
- unique()
- 迭代器
- iterator(默認容器為vector,名稱為v)
- reverse_iterator
- 參考資料
STL(標準模板庫)
STL組成的六部分:算法、容器、迭代適配器、迭代器、仿函數、空間配制器。
容器:
vector-變長數組
-
底層實現:數組
-
頭文件:#include <vector>
-
定義
- vector<typename> name; //可以看成一維數組
- vector<vector<typename> > name; // 可以看成二維數組
-
定義vector數組:
- vector<typename> Arrayname[arrySize];//可以看成二維數組,但不同于vector<vector<typename> > 的是,一維的長度已經固定了。
-
訪問:
- 通過下標訪問:name[index];
- 通過迭代器(iterator)訪問,這里用循環來解釋: for(vector<typename>::iterator it = name.begin(); it!=name .end();it++) { cout<<*it<<end;;}//此時*it是vector里的元素。或 for(auto it:name){cout<<it<<" "}//基于范圍的for循環。
-
常用函數:
函數名push_back()pop_back()size()clear()insert(it,x) 功能 尾插 尾刪 長度 清空 向迭代器it處插入元素x 時間復雜度 O(1) O(1) O(1) O(n) O(n) -
erase()
- erase(it) 刪除目前迭代器指向 的元素
- erase(first,last) 刪除區間內的元素PS(first與last都是迭代器)
- 時間復雜度O(n)
set-內部自動有序且不含重復元素
- 底層實現:紅黑樹
- 頭文件:#include<set>
- 定義set:set<typename >name
- 訪問:只通過迭代器來訪問。 for(set<typename>::iterator it = name.begin(); it!=name .end();it++) { cout<<*it<<end;;}或 for(auto it : name){cout<<it<<" "}//此時*it是set里的元素。
- 常用函數:
| 功能 | 插入 | 返回對應值為value的迭代器 | 容器長度 | 清空容器 |
| 時間復雜度 | O(logN) | O(logN) | O(1) | O(N) |
name.erase(it)刪除當前迭代器it指向的值。時間復雜度O(1)
name.erase(value)刪除value這個值。時間復雜度O(logN)
name.erase(first,last)刪除區間[first,last)內的元素。時間復雜度O(last-first).first與last都為迭代器
string-字符串
- string 讀入可以用cin,輸出可以用cout,也可以用printf("%s",ss.c_str());
- 頭文件:#include<string>
- 定義:
- 一維:string str;
- 二維:string str[maxx];
- 訪問:
- 通過下標訪問
- 通過迭代器訪問
- 常用技巧
| 清空 | 拼接賦值 | 通過字典序來比較大小 | 長度 | 返回從pos號位開始,長度為len的子串 |
| O(1) | O(1) | O(len) |
- insert()
- insert(pos,string) 在pos位置插入string
- insert(it1,it2,it3) 在it1位置上插入[it2,it3)區間的字符串。其中it1,it2,it3均為迭代器
- erase()
- erase(it) 刪除it指向的字符
- erase(first,last) 刪除區間[first,last)所有的元素
- erase(pos,len) 刪除從pos開始的len長度的字符個數
- find()
- find(str2) 找到子串第一次出現的位置,若不是,返回string::npos ^ 1
- find(str2,pos) 從str的pos開始開始匹配str2
- 時間復雜度為:O(nm)。其中n、m分別是str和ser2的長度
- repalce()
- replace(pos,len,str2) 把str從pos號位開始,長度位len的子串替換為str2
- replace(it1,it2,str2) 把str的迭代器[it1,it2)范圍的子串替換為str2
- 時間復雜度為:O(str.size())。
map-鍵值對(key-value)
-
底層實現:紅黑樹
-
頭文件:#include<map>
-
定義:map<typename1,typename2 > name
-
訪問:
-
通過下標訪問
-
通過迭代器訪問
for(map<typename1, typename2>::iterator it = name.begin(); it != name.end(); it++{it->first; //訪問鍵it->second;//訪問值 }
-
-
常用函數:
| 功能 | 返回key的映射的迭代器 | 長度 | 清除 |
| 時間復雜度 | O(logN) | O(1) | O(N) |
- erase()
- erase(it) 刪除it指向的元素。O(1)
- erase(key) 刪除鍵中為key的值。O(logN)
- erase(first,last) 刪除[first,last)區間元素。O(last-first)
queue-隊列
- 底層實現:用list或deque(默認)實現,封閉頭部即可
- 頭文件:#include<queue>
- 定義:queue<typename> name
- 訪問:
- front()隊首
- back() 隊尾
- 常用函數
| 功能 | 入隊 | 取隊頭/隊尾 | 隊頭出隊 | 隊列判空 | 判斷隊中的元素 |
| 時間復雜度 | O(1) | O(1) | O(1) | O(1) | O(1) |
priority_quque-優先隊列(自動排序的隊列)
- 底層實現:以vector為底層容器,堆為處理規則來管理底層容器
- 默認為數字大的優先級高
- 頭文件:#include<queue>
- 定義:priority_queue< typename > name;
- 訪問: name.top()
- 常用函數
| 功能 | 入隊 | 取隊頭 | 隊頭出隊 | 隊列判空 | 判斷隊中的元素 |
| 時間復雜度 | O(1) | O(1) | O(1) | O(1) | O(1) |
-
優先級設置
-
基本數據類型
priority_queue<int > q; priority_queue<int,vector<int>,less<int> > q;//數字大的優先級大 priority_queue<int,vector<int>,greate<int> > q;//數字小的優先級大 注:vector<int>是來承載底層heap的容器。less<int>與greater<int>是對第一個參數的比較類。 -
結構體
-
將重載放到結構體內
struct student{string s_id;int s_grade;friend bool operator < (student s1,student s2){return s1.s_grade < s2.s_grade;//s_grade大的優先級高} } priority_queue<student> q; -
將重載放到結構體外
struct cmp{bool operator (const student &s1,const student &s2){return s1.s_grade > s2.s_grade;} } priority_queue<student,vector<student>, cmp> q;
-
-
stack-棧
-
底層實現:用list、deuqe(默認)或vector實現,封閉頭部即可
-
頭文件:#include<stack>
-
定義:stack<typename > name;
-
訪問:使用top()來訪問棧頂元素
-
常用函數:
函數名push()top()pop()empty()size() 功能 入棧 取棧頂元素 出棧 判斷棧是否為空 當前棧的長度 時間復雜度 O(1) O(1) O(1) O(1) O(1)
pair-對
- 頭文件:#include<utility>
- 定義:pair<typename1,tepename2 > name
- 訪問:name.first/name.second 分別表示第一個元素和第二個元素。
- 常用技巧:
- 插入
- 用函數插入:make_pair(name.first,name.sceond);
- 直接插入:cin>>name.first>>name.sceond
- 比較操作符^2 :比較規則是先比較first,first相同時再比較second。
- 插入
算法
sort()與stable_sort()
-
這里多說一下,數組排序就是從你指定的地址開始,在你給定的長度之前排序。但是string有點不一樣,如果你像用數組那么使用,那便是你對string數組進行排序。當你要對單個的string進行排序時用法為:sort(name[i].begin(),name[i].end())
-
sort():默認升序重新排序指定訪問的元素??芍剌d
-
用法:
-
sort(v.begin(),v.end(),less<int>())//升序
-
sort(v.begin(),v.end(),greate<int>())//降序
- bool cmp(int a,int b){return a > b; } sort(v.begin(),v.end(),cmp);
-
-
不穩定的排序
-
時間復雜度O(NlogN);
-
-
stable_sort():與sort類似,不過保留相等元素之間的順序關系??芍剌d
- 穩定的排序
- 時間復雜度:O(Nlog2(N))
random_shuffle()
- 對指定范圍被的元素隨機排序
- 時間復雜度O(1);
lower_bound()與upper_bound()
- 二分查找函數,返回的是迭代器
- lower_bound():
- 用法:lower_bound(v.begin(),v.end(),20)-v.begin();//在vector里面查找第一個大于或等于20的下標
- 返回第一個大于或等于查找的數的地址。
- upper_bound():
- 用法:upper_bound(v.begin(),v.end(),20)-v.begin();//在vector里面查找第一個大于20的下標
- 返回第一個大于查找的數的地址。
next_permutation()
- 全排列函數
- 用法
- 時間復雜度:O(N!)
unique()
- 有序數組去重
- 用法:unique(a,a+n)-a; 返回的是數組去重后的長度。
- 時間復雜度:O(N)
迭代器
可以看成是廣義的指針,所以我們使用的時候要加上一個*。
iterator(默認容器為vector,名稱為v)
-
最普通的迭代器,也最常用。
-
定義:vector<typename>::iterator it ;
-
大多數我們使用迭代器就是為了遍歷當前容器。
vector<typename>::iterator it; for(it = v.begin(); it != b.end(); it++)cout<<*it<<" ";//輸出當前容器 -
C++11新特性
-
使用auto可以減少代碼量,但只有編譯器支持C++11才可以用
for(auto it : v)cout<<it<<" ";
-
reverse_iterator
- 反向迭代器
- 用法與iterator相反。
- 這里用循環演示一下:for(vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); it++)
參考資料
- c++標準模板庫STL【快速查找】【最全】【常用】【語法】
- STL底層數據結構實現
- C++ STL 一般總結
- 維基百科
總結
- 上一篇: 成都东软学院新生周赛(五)
- 下一篇: 如何求欧拉函数~转载