STL相關知識

一.隊列(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() )

二分查找函數(時間複雜度O(logn)):binary_search();
 
頭文件:  #include<algorithm>
 
函數模板:binary_search(arr[],  size  ,  key)         
 
參數說明:       arr[]: 數組首地址
                         size:  數組元素個數
                         key:  須要查找的值
 
函數功能:  在數組中以二分法檢索的方式查找,若在數組(要求數組元素非遞減)中查找到key元素則返回其下標,若查找不到則返回值爲假。
 
lower_bound()函數和upper_bound()函數
    注意: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可用於鄰接表存圖之類的。

相關文章
相關標籤/搜索