stl clocklist 查找元素_C++算法竞赛中常用的STL
什么是STL?
STL,Standard Template Library的縮寫,標準模版庫的意思。STL是一些“容器”的集合,這些容器包括list、 vector、set、queue等。
PS:這里說明下,文中出現的DataType指數據類型,DataName指變量名,cmp指一個返回類型為bool的比較函數
iterator 迭代器:
要訪問順序容器和關聯容器中的元素,需要通過“迭代器(iterator)”進行。迭代器是一個變量,相當于容器和操縱容器的算法之間的中介。迭代器可以指向容器中的某個元素,通過迭代器就可以讀寫它指向的元素。從這一點上看,迭代器和指針類似。
迭代器按照定義方式分成以下四種。
1)正向迭代器,定義方法如下:
????? 容器類名::iterator 迭代器名;
2)常量正向迭代器,定義方法如下:
????? 容器類名::const_iterator 迭代器名;
3)反向迭代器,定義方法如下:
???? 容器類名::reverse_iterator 迭代器名;
4)常量反向迭代器,定義方法如下:
?????容器類名::const_reverse_iterator 迭代器名;
迭代器用法示例會在后邊不同容器示例中展示。
vector 動態數組
所謂動態數組,就是不定長數組。
頭文件:#include
聲明:vector DataName;
基本操作:
- push_back();,在最后面插入一個新元素 
- size(),返回vector的長度 
- clear(),清空vector 
- 可以像數組一樣使用。 
例子:
vector vec; //空的vec.push_back(0); //有0vec.push_back(1); //有0,1vec.push_back(2); //有0,1,2//兩種遍歷方法for(int i=0; i printf("%d\n",vec[i]);}for(vector::iterator it=vec.begin(); it!=vec.end(); it++){ printf("%d\n",*it);//迭代器訪問}vec[1]=3; //變成0,3,3vec[2]=2;??//變成0,3,2vec.clear();//清空stack 棧
先進后出的數據結構(FILO)
頭文件:#include
聲明:stack DataName;
基本操作:
- push(),入棧 
- pop(),出棧 
- top(),訪問棧頂元素 
- empty(),判斷棧空 
- size(),返回棧中元素個數 
例子:
s.push(1); //{1}s.push(233); //{233,1}s.push(666); //{666,233,1}cout<cout<s.pop(); //{233,1}s.push(2);??//{2,233,1}?queue 單向隊列
先進先出的數據結構(FIFO)
頭文件:#include
聲明:queue DataName;
基本操作:
- push(),入隊 
- pop(),出隊 
- front(),訪問隊首元素 
- back(),訪問隊尾元素 
- empty(),判斷隊空 
- size(),返回隊列元素個數 
例子:
int e,m,n;queue q1;for(int i=0;i<10;i++) q.push(i); //入隊 //[0,1,2,3,4,5,6,7,8,9]if(!q1.empty()) cout<n=q1.size(); //n=10m=q1.back(); //m=9for(int i=0;i e=q1.front(); //取隊首元素 cout< q1.pop(); //出隊 }cout<if(q1.empty())??cout<set 集合
集合中不會存在重復元素,支持高效的插入、刪除和查詢操作,復雜度均是O(logn)(對比使用數組來實現,雖然插入的時間復雜度O(1),但是刪除和查詢的時間復雜度卻是O(n))。
頭文件:#include
聲明:set DataName;
基本操作:
- begin(),返回set第一個元素(類型為迭代器,或者說指針) 
- end(),返回set最后一個元素(同上) 
- clear(),清空set中的元素 
- empty(),判斷set是否為空 
- insert(),插入一個元素 
- erase(),刪除一個元素 
- find(),查找一個元素,返回為迭代器 
- size(),返回set的元素個數 
例子:
set s;set::iterator?it;s.insert(1); //{1}s.insert(2); //{1,2}s.insert(3); //{1,2,3}s.insert(1); //{1,2,3}s.erase(1);????//{2,3}it=s.find(2);??//查找元素2,若未找到,返回s.end()?map 映射
從一個元素映射到另一個元素的數據結構,hash是他的一種。
頭文件:#include
聲明:map DataName;從DataTypeA映射到DataTypeB
基本操作:
- 可以像數組一樣使用 
- 迭代器有兩個屬性,first代表key,second代表value 
- count(),判斷是否存在映射 
- clear(),清空map 
例子:
map<string,int> dict; //{}dict["Tom"]=1; //{"Tom":1}dict["Jone"]=2; //{"Tom":1,"Jone":2}dict.insert(map<string,int>::value_type("Mary",1));// //{"Tom":1,"Jone":2,"Mary":1}if(dict.count("Mary")){ printf("Mary存在");} else{ printf("Mary不存在");}//迭代器訪問 for(map<string,int>::iterator it=dict.begin(); it!=dict.end(); it++){ cout<first<<":"<second<<endl;}priority_queue 優先隊列
實質就是二叉堆,使用該模版可以快速實現小根堆、大根堆。插入、刪除、查詢的時間復雜度均是O(logn)。
頭文件:#include
聲明:默認小根堆,priority_queue DataName;
自定義比較函數,priority_queue,cmp> DataName;
基本操作:
- push(),隊尾插入元素 
- pop(),取出隊首元素 
- top(),訪問隊首元素 
- size(),獲取隊列長度 
- clear(),清空隊列 
例子:
struct cmp{ bool operator() (const int &a,const int &b){//&引用 return a>b; //最大堆 } };priority_queue<int,vector<int>,cmp> q;//[]q.push(2); //[2]q.push(1); //[2,1]q.push(3); //[3,2,1]for(int i=0;i printf("%d\n",q.top());//逐個輸出隊首 q.pop();//出隊 }sort 快排函數
頭文件:#include
sort(begin,end,cmp);? //begin為序列開始地址,end序列結束地址,cmp比較函數,cmp可以不填,默認升序
數組排序:
int a[4]={2,4,3,1};int n=4;sort(a,a+n);vector排序:
sort(vec.begin(),vec.end());結構體排序:
struct Point{ int x,y;}p[4]={{1,2},{1,0},{2,1},{0,1}};?bool cmp(Point a,Point b){ //比較函數,x為主關鍵字升序,y為次關鍵字升序 if(a.x==b.x) return a.y return a.x}int main(){ sort(p,p+4,cmp); return 0;}添加涵爸微信,共同交流
~關于涵爸的介紹
標簽一:奶爸(這是我最自豪的,沒有之一)
8年奶爸生涯剛結束
新一輪奶爸生涯又開始
小二寶悄悄降臨
笑聲不斷,歡樂無窮
標簽二:編程高手(這是我給自己封的,有待認可)
才疏學淺,短見薄識
軟件開發只有10多年的經驗
掌握的C++和Java技能還不夠出神入化
前端HTML、CSS、JS的嫻熟度也不足百分
大數據、云計算、人工智能等也只略知一二
虛心萬事能成,自滿十事九空
涵爸愿虛心學習
不辜負此“高手”二字
標簽三:老師(這是自己未來的定位,還需努力)
孩子的教育大于一切
于是我放棄了高薪
編程的普及大勢所趨
于是我趟了這趟渾水
能力一般,水平有限
涵爸定當全力以赴
為大家分享最優質的信息
做出最專業的課堂
關注涵爸了解更多少兒編程知識。
總結
以上是生活随笔為你收集整理的stl clocklist 查找元素_C++算法竞赛中常用的STL的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: c++ 获取时间戳_分布式系统理论基础三
- 下一篇: python基础list_python基
