『OI常用的c++STL容器及函式』
·vector
·queue
·priority_queue
·deque
·set
·map
·stack
·sort
·upper_bound,lower_bound,binary_search
<更新提示>
<第一次更新>
<正文>
vector
c++stl自帶的不定長陣列。
標頭檔案:#include<vector>
定義:vector<type>name
(定義type型別的vector)
常用函式:
#include<vector>
using namespace std;
int main()
{
vector<int>v;
v.reserver(n);//擴大容量為n
v.clear();//清空容器
v.erase(pos);//刪除位置為pos的元素
v.erase(begin,end);//刪除區間[begin,end)的所有元素
v[i];//訪問第i個元素,用法與陣列相同
v.front();//返回第一個元素
v.back();//返回最後一個元素
v.push_back(e);//在尾部新增元素e
v.pop_back();//移除最後一個元素
}
queue
c++stl自帶佇列。
標頭檔案:#include<queue>
定義:queue<type>name
(定義type型別的queue)
常用函式:
#include<queue>
using namespace std;
int main()
{
queue<int>q;
q.clear();//清空容器
q.erase(pos);//刪除位置為pos的元素
q.erase(begin,end);//刪除區間[begin,end)的元素
q.push(a);//將元素a加入佇列
q.front();//返回隊頭元素的值
q.back();//返回隊尾元素的值
q.size();//返回佇列中的元素個數
q.empty();//返回佇列是否為空
}
priority_queue
c++stl自帶優先佇列(堆)。
標頭檔案:#include<queue>
定義:
priority_queue< type,vector<type>,less<type> >name
(定義type型別的大根堆)
priority_queue< type,vector<type>,greater<type> >name
(定義type型別的小根堆)
常用函式:
#include<queue>
#include<vector>
using namespace std;
int main()
{
priority_queue< int,vector<int>,less<int> >q;
q.clear();//清空容器
q.push(a);//將元素a加入堆
q.top();//取出堆頂元素
q.pop();//彈出堆頂元素
q.empty();//返回堆是否為空
q.size();// 返回堆中元素個數
}
deque
c++stl自帶的雙端佇列。
標頭檔案:#include<deque>
定義:deque<type>name
(定義type型別的deque)
常用函式:
#include<deque>
using namespace std;
int main()
{
deque<int>d;
d[i];//訪問第i元素,用法與陣列相同
d.clear();//清空容器
d.front();//返回第一個元素
d.back();//返回最後一個元素
d.pop_back();//彈出尾元素
d.pop_front();//彈出首元素
d.push_back();//加入尾元素
d.push_front();//加入首元素
}
set
c++stl自帶的集合容器。
標頭檔案:#include<set>
定義:
set< type,less<type> >name
(內部升序排序的set)
set< type,greater<type> >name
(內部降序排序的set)
常用函式:
#include<set>
using namespace std;
int main()
{
set<int>s;
s.count(t);//返回集合中元素t的個數
s.empty();//返回集合是否為空
s.size();//返回集合中元素的個數
s.insert(t);//插入元素t
s.insert(begin,end);//插入區間[begin,end)中的所有值
s.erase(pos);//刪除位置為pos的元素
s.erase(begin,end);//刪除區間[begin,end)的所有元素
}
集合不允許重複的元素存在,而multiset允許重複的元素存在。其所有常用用法均與set相同。
map
c++stl自帶的一種提供鍵與值一一對應的資料儲存結構,類似於python的字典(dictionary)。
標頭檔案:#include<bits/stdc++.h>
定義:map<key,value>name
(定義鍵型別為key,值型別為value的map)
常用函式:
#include<map>
using namespace std;
int main()
{
map<int,int>m;
m[n];//訪問map中鍵為n的元素,與陣列相同
m.count(n);//返回map中鍵為n的元素個數
m.find(n);//返回指向鍵為3的迭代器,如果不存在,返回m.end()
m.empty();//返回map是否為空
m.size();//返回map中的元素個數
m.erase(e);//刪除鍵為e的元素
m.insert(make_pair(key,value));//在map中加入鍵為key,值為value的元素
}
map中同樣不允許重複元素的存在,而multimap允許重複元素存在,其所有常用用法均與map相同。
stack
c++stl自帶的棧容器。
標頭檔案:#include<map>
定義:stack<type>name
(定義type型別的stack)
常用函式:
#include<stack>
using namespace std;
int main()
{
stack<int>s;
s.size();//返回棧中元素個數
s.empty();//返回棧是否為空
s.clear();//清空棧
s.top();//返回棧頂
s.pop();//棧頂出棧
s.push(a);//將元素a加入佇列
}
sort
c++演算法庫自帶的快排函式。
標頭檔案:#include<algorithm>
用法:sort(begin,end,cmp)
(對區間[begin,end)進行排序,若不傳入引數cmp,使用預設的operator <進行排序,即升序,從小到大)
cmp函式的寫法:
inline bool cmp(int a,int b)
{
if(a>b)return true;else return false;
}
程式碼片是一個從大到小,降序cmp函式的寫法。
cmp函式必須為bool型別,在形參中定義兩個需要排序型別的引數。根據你需要的條件對形參進行判斷,若返回true則形參中的第一個排在前面,若返回false則形參中的第二個排在前面。在sort排序時呼叫其作為第三個形參即可。
upper_bound,lower_bound,binary_search
這是三個c++stl自帶的二分查詢函式。
標頭檔案:#include<algorithm>
用法:
upper_bound(begin,end,value)
(返回有序區間[begin,end)中第一個大於value的元素位置,注意返回的時地址,如需使用要在呼叫後加上“-陣列名”)
lower_bound(begin,end,value)
(返回有序區間[begin,end)中第一個大於等於value的元素位置,注意返回的時地址,如需使用要在呼叫後加上“-陣列名”)
binary_search(begin,end,value)
(返回有序區間[begin,end)中是否存在value,不指明位置)
這三個函式都是在有序區間內使用的函式,原理時二分查詢,時間複雜度為
。
小結
這些都是OI競賽中常用的c++stl自帶函式或容器,能很好的幫助我們實現程式碼,需要我們靈活運用,成為我們的助手。並且這些函式和容器全部允許在noip中使用,需要我們很好的掌握。
<後記>
<廢話>