C++算法競賽中常用的STL

快考CSP了,C/C++玩家的福利來了

首先介紹下,什麼是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>

聲明:vector<DataType> DataName;

基本操作:

  • push_back();,在最後面插入一個新元素
  • size(),返回vector的長度
  • clear(),清空vector
  • 可以像數組一樣使用。

例子:

vector<int> vec;	//空的
vec.push_back(0);	//有0
vec.push_back(1);	//有0,1
vec.push_back(2);	//有0,1,2
//兩種遍歷方法
for(int i=0; i<vec.size(); i++){
   
   
	printf("%d\n",vec[i]);
}
for(vector<int>::iterator it=vec.begin(); it!=vec.end(); it++){
   
   
	printf("%d\n",*it);//迭代器訪問
}

vec[1]=3;	//變成0,3,3
vec[2]=2;	//變成0,3,2

vec.clear();//清空

stack 棧

先進後出的數據結構(FILO)

頭文件:#include<stack>

聲明:stack<DataType> DataName;

基本操作:

  • push(),入棧
  • pop(),出棧
  • top(),訪問棧頂元素
  • empty(),判斷棧空
  • size(),返回棧中元素個數

例子:

s.push(1);	//{1}
s.push(233);	//{233,1}
s.push(666);	//{666,233,1}
cout<<s.top()<<endl;	//輸出棧頂666
cout<<s.size()<<endl;	//輸出棧中元素個數3
s.pop();	//{233,1}
s.push(2);	//{2,233,1} 

queue 單向隊列

先進先出的數據結構(FIFO)

頭文件:#include<queue>

聲明:queue<DataType> DataName;

基本操作:

  • push(),入隊
  • pop(),出隊
  • front(),訪問隊首元素
  • back(),訪問隊尾元素
  • empty(),判斷隊空
  • size(),返回隊列元素個數

例子:

int e,m,n;
queue<int> 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<<"no empty\n";
n=q1.size();	//n=10
m=q1.back();	//m=9
for(int i=0;i<n;i++){
   
   
	e=q1.front();	//取隊首元素
	cout<<e<<" ";
	q1.pop();	//出隊 
}
cout<<endl;
if(q1.empty())
	cout<<"queue is empty"; 

set 集合

集合中不會存在重複元素,支持高效的插入、刪除和查詢操作,複雜度均是O(logn)(對比使用數組來實現,雖然插入的時間複雜度O(1),但是刪除和查詢的時間複雜度卻是O(n))。

頭文件:#include<set>

聲明:set<DataType> DataName;

基本操作:

  • begin(),返回set第一個元素(類型爲迭代器,或者說指針)
  • end(),返回set最後一個元素(同上)
  • clear(),清空set中的元素
  • empty(),判斷set是否爲空
  • insert(),插入一個元素
  • erase(),刪除一個元素
  • find(),查找一個元素,返回爲迭代器
  • size(),返回set的元素個數

例子:

set<int> s;
set<int>::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>

聲明:map<DataTypeA,DataTypeB> 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<<it->first<<":"<<it->second<<endl;
}

priority_queue 優先隊列

實質就是二叉堆,使用該模版可以快速實現小根堆、大根堆。插入、刪除、查詢的時間複雜度均是O(logn)。

頭文件:#include<priority_queue>

聲明: 默認小根堆,priority_queue<DataType> DataName;

自定義比較函數,priority_queue<DataType,vector<DataType>,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<q.size();i++){
   
   
	printf("%d\n",q.top());//逐個輸出隊首
	q.pop();//出隊 
}

sort 快排函數

頭文件:#include<algorithm>

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<b.y;
	return a.x<b.x;
}

int main(){
   
   
	sort(p,p+4,cmp);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章