一.隊列(queue先進先出)node
簡介:先進先出(FIFO)的線性表ios
1.使用方法
頭文件:#include <queue>數組
普通聲明:queue <int> Q;數據結構
特殊聲明:(結構體)less
struct node{ int x,y; }; queue<node>Q;
(後面其餘STL的聲明以T表明數據類型)函數
2.基本操做spa
1.Q.push(A) 在隊列Q末尾加入一個元素A
2.Q.pop() 刪除隊列Q第一個元素
3.Qfront() 返回隊列Q第一個元素
4.Q.back() 返回隊列Q最後一個元素
5.Q.empty() 若是隊列Q爲空則返回真
6.Q.size() 返回隊列Q中元素的個數code
二.優先隊列(priority_queue)對象
簡介:優先隊列具備最高級先出[first in,largest out]的行爲特徵blog
1.使用方法:
頭文件:#include <queue>
聲明:priority_queue <T>Q; /* 默認從大到小排序 */
priority_queue < T,vector<T>,greater<T> > /*從小到大排序,greater改爲less爲從大到小排序*/
對於優先隊列裏元素爲一個結構體類型,可對比較函數進行重載,使其按照某一個屬性排序
2.基本操做
1.Q.push() 在隊列中加入一個元素
2.Q.pop() 刪除隊列優先級最高的元素(隊頂元素)
3.Q.top() 返回優先隊列中優先級最高的元素(隊頂元素)
4.Q.size() 返回優先隊列中元素的個數
5.Q.empty() 若是優先隊列爲空則返回真
優先隊列時間複雜度:O(logn)
經過友元函數進行運算符重載:(優先隊列默認從大到小排,因此 '<' 表明的是從大到小,比較特殊!)
struct node{ int x; int y; friend bool operator < (node n1,node n2){ return n1.x < n2.x; //"<"爲從大到小排列,">"爲從小到大排列。 } };
三.雙向隊列(deque)
簡介:顧名思義,雙向
1.使用方法
頭文件:#include <deque>
聲明:deque <T> d_q;
2.基本操做
1.front() 返回第一個元素
2.back() 返回最後一個元素
3.pop_back() 刪除尾部的元素
4.pop_front() 刪除頭部的元素
5.push_back() 在尾部加入一個元素
6.push_front() 在頭部加入一個元素
7.size() 返回雙向隊列中元素的個數
8.clear() 刪除全部元素
9.empty() 若是雙向隊列爲空則返回真
四.集合(set)
簡介:集合是實現了紅黑樹的平衡二叉檢索樹的一種數據結構。集合的互異性:同一個集合中的元素是互不相同的(敲黑板!)
1.使用方法
頭文件:#include <set>
聲明:set <T> s;
2.基本操做
1.begin() 返回第一個元素的地址
2.end() 返回最後一個元素的下一個位置的地址
3.insert(key) 插入鍵值key
4.erase(key) 刪除鍵值key的值
5.erase(it) 刪除定位器it指向的值(指定地址)
6.find(x) 返回找到x的位置,若是沒找到返回end()的位置。
7.count(key) 返回集合中key值的個數,其實就是判斷有無的另外一種方法。
8.lower_bound(x)返回不小於x的第一個數的位置,在set自動排序的基礎上去使用,很是方便。
9.upper_bound(x)返回大於x的第一個數的位置,在set自動排序的基礎上去使用,很是方便。
10.clear() 刪除全部元素
11.empty() 若是集合爲空則返回真
12.size() 返回集合擁有的元素個數
set默認從小到大排序。
迭代器:(容器都能使用)
set<int>::iterator it;//定義前向迭代器 for(it=s.begin();it!=s.end();it++){ cout<<*it<<endl; }
五.多重集合(multiset)
簡介:性質和使用方法與set基本相同。特別的是多重集合無set的互異性。
1.使用方法
頭文件:#include <set>
聲明:multiset <T> m_s;
2.基本操做與set相同
在multiset中的erase()的功能比較特別:(特好用的一個特性)
erase(it) 刪除定位器it指向的值(指定地址) /* it爲地址 */
erase(x) 刪除集合裏面全部的x /* x爲具體的值 */
六.棧(stack後進先出)
簡介:棧做爲一種數據結構,是一種只能在一端進行插入和刪除操做的特殊線性表。(以 ''後進先出'' 爲原則)
1.使用方法
頭文件:#include <stack>
聲明:stack <T> sta;
2.基本操做 (棧基本操做雖然少,可是棧的特性超級無敵好用!)
1.top() 返回最後一個元素
2.pop() 刪除最後一個元素
3.push() 在末尾加入一個元素
4.empty() 若是棧爲空則返回真
5.size() 返回棧中元素的個數
七.映射(map)
簡介:map爲從鍵(key)到值(value)的映射。而且map提供'' [] ''運算符,使得map能夠像數組同樣使用,所以map也稱爲''關聯數組''。(很是好用的一種STL)
舉個栗子:例如能夠用一個map<string, int> month_name 來表示「月份名字到月份編號」的映射,而後用month_name["July"] = 7 這樣的方式來賦值。
1.使用方法
頭文件:#include <map>
聲明:map <T1,T2> m;
2.基本操做
1.insert() 插入元素
2.empty() 若是映射爲空則返回真
3.size() 返回映射中元素的個數
4.erase() 刪除元素
5.clear() 清空
經驗之談:對於map,我基本上都拿來當數組用的。有時候數組下標沒法定到題目中要求的,能夠用映射解決。map的初始值爲0或空。map <string,int> m;此時若是m["July"]沒有賦值,那麼m["July"]=0。同理map <int,string> m; m[1]沒有賦值的話,m[1]='''';
八.STL之二分查找(binary_search(),lower_bound(),upper_bound() )
一、 upper_bound():前閉後開區間進行二分查找查找的關鍵字的上界 返回容器中第一個值【大於】val的元素的iterator位置。
使用方法( 擴展使用:nlogn的(最長不降子序列),upper_bound() )
頭文件:#include <algorithm>
使用前提:非降序列
舉個例子:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 int main(){ 6 int number[10]={10,11,12,13,14,15,16,17,18,19}; 7 int pos=upper_bound(number,number+10,10)-number; 8 cout<<pos<<endl;//pos=1; 9 pos=upper_bound(number,number+10,14)-number; 10 cout<<pos<<endl;//pos=5 11 pos=upper_bound(number,number+10,19)-number; 12 cout<<pos<<endl;//pos=10 13 }
二、lower_bound():前閉後開區間進行二分查找 返回容器中第一個值【大於或等於】val的元素的iterator位置。
頭文件:#include <algorithm>
使用前提:非降序列
舉個例子:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 int main(){ 6 int number[10]={10,11,12,13,14,15,16,17,18,19}; 7 int pos=lower_bound(number,number+10,10)-number; 8 cout<<pos<<endl;//pos=0; 9 pos=lower_bound(number,number+10,14)-number; 10 cout<<pos<<endl;//pos=4 11 pos=lower_bound(number,number+10,19)-number; 12 cout<<pos<<endl;//pos=9 13 }
九.不定長數組(vector)
簡介:vector是同一種對象的集合,每一個對象都有一個對應的整數索引值。(簡單來講就是不定長數組)
1.使用方法
頭文件:#include <vector>
聲明:vector <T> v;
2.基本操做
1.向量大小: vec.size();
2.向量判空: vec.empty();
3.末尾添加元素: vec.push_back();
4.末尾刪除元素: vec.pop_back();
5.訪問第一個元素: vec.front();
6.訪問最後一個元素: vec.back();
7.元素翻轉:reverse(vec.begin(), vec.end());
8.sort(vec.begin(), vec.end()); //採用的是從小到大的排序
vector可用於鄰接表存圖之類的。