1. 程式人生 > >『OI常用的c++STL容器及函式』

『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,不指明位置)
這三個函式都是在有序區間內使用的函式,原理時二分查詢,時間複雜度為 O ( n l o g 2 n )

小結

這些都是OI競賽中常用的c++stl自帶函式或容器,能很好的幫助我們實現程式碼,需要我們靈活運用,成為我們的助手。並且這些函式和容器全部允許在noip中使用,需要我們很好的掌握。


<後記>


<廢話>