c++的stl容器
vector動態陣列
需要用到標頭檔案#include
定義方式
vector
vector
struct res{}; vector
vector
庫函式
size/empty/clear
size返回vector大小,empty判斷是否為空,若為空返回1,否則返回0,clear清空陣列
cout<<a.size()<<endl;
a.clear();
cout<<a.size()<<endl<<a.empty()<<endl;
迭代器
vector
begin/end
begin函式返回指向vector中第一個元素的迭代器
end函式返回指向vector中最後一個元素的迭代器
通過迭代器可以遍歷整個函式。
vector
for(it=a.begin();it!=a.end();it++){
cout<<*it<<" ";
}
類似於通過size訪問,因為vector支援陣列下標的隨機訪問。
for(i=0;i<a.size();i++){
cout<<a[i]<<" ";
}
front/back
front函式返回vector的第一個元素。
back函式返回vector的最後一個元素。
push_back/pop_back()
a.push_back(x)把元素x插入到vector a的尾部
b.pop_back()刪除vector a的最後一個元素。
a.push_back(111);
cout<<endl<<a.front()<<" "<<a.back();
a.pop_back();
cout<<" "<<a.back()<<endl;
queue佇列
標頭檔案#include
定義方式
queue
struct res{} queue
priority_queue
priority_queue<int,vector
priority_queue<pair<int,int>>q;
迴圈佇列queue
push從隊尾插入
pop從隊頭彈出
front返回隊頭元素
back返回隊尾元素
queue
for(i=0;i<=10;i++)
q.push(i);
cout<<q.size()<<endl;
q.push(3);
int t=q.size();
for(i=0;i<t;i++){
cout<<q.front()<<" ";
q.pop();
}
優先佇列priority_queue
push把元素插入堆
pop刪除堆頂元素
top查詢堆頂元素
cout<<endl;
priority_queue
for(i=0;i<=10;i++)
qs.push(i);
cout<<qs.size()<<endl;
int ts=qs.size();
qs.push(3);
for(i=0;i<ts;i++){
cout<<qs.top()<<" ";
qs.pop();
}
注:優先佇列內元素預設是有序的,從大到小排序,全部彈出之後佇列大小都為0,不支援下標隨機訪問,在使用迴圈中使用q.size()時,要將它先進行賦值,不然每次彈出佇列元素時。相應的佇列大小都會進行改變。
stack棧
標頭檔案#include
定義方式
stack
struct res{}; stack
庫函式
push 向棧頂插入元素
pop 彈出棧頂元素
for(i=0;i<=10;i++)
s.push(i);
s.push(3);
int m=s.size();
cout<<endl;
for(i=0;i<m;i++){
cout<<s.top()<<" ";
s.pop();
}
棧和佇列類似,棧是先進後出,佇列是先進先出,都不支援陣列下標的隨機訪問。
deque雙端佇列
支援在兩端進行高效插入和刪除元素的連續線性儲存空間,像vector和queue的結合,與vector相比deque的頭部增刪元素僅需要O(1)的時間與queue相比,deque可以支援像陣列一樣的隨機訪問,需要用到標頭檔案#include
定義方式
deque
struct res{}; deque
庫函式
[ ]根據下標進行隨機訪問
begin/end 返回deque的頭/尾迭代器
front/back 隊頭/隊尾元素
push_back 從隊尾入隊
push_front 從隊頭入隊
pop_back 從隊尾出隊
pop_front 從隊頭出隊
clear 清空佇列
deque
for(i=0;i<=10;i++){
d.push_front(i);//隊頭插入
d.push_back(i);//隊尾插入
}
int n=d.size();//佇列大小
for(i=0;i<n;i++)
cout<<d[i]<<" ";//下標隨機訪問
cout<<endl;
deque<int>::iterator de;
for(de=d.begin();de!=d.end();de++){
cout<<*de<<" ";
}
cout<<endl;
d.push_front(100);//在頭部插入值為100的元素
cout<<d.front()<<" ";// 隊頭元素
d.pop_front(); //彈出當前隊頭元素
cout<<d.front()<<" ";// 此時的隊頭元素
cout<<endl;
d.push_back(200);//在頭部插入值為兩百的元素
cout<<d.back()<<" ";//隊尾元素
d.pop_back();//彈出隊尾元素
cout<<d.back()<<" ";//此時隊尾元素
d.clear();//清空佇列
cout<<endl<<d.size();//清空佇列後此時佇列大小為0
set集合
標頭檔案#include
定義方式
set
struct res{};set
multiset
庫函式
size/empty/clear
set
cout<<ss.size()<<endl;
ss.clear();
cout<<ss.empty()<<endl;
迭代器
set和multiset的迭代器稱為雙向訪問迭代器,不支援隨機訪問,支援解引用,僅支援++和--兩個算術相關操作。
set
it++指向下一個元素it--指向上一個元素
begin/end 返回集合的首尾迭代器,時間複雜度為O(1)
s.insert(x)將一個元素x插入到集合s中,若set中該元素已存在則不會重複進行插入
s.find(x)在集合s中查詢等於x的元素,並指向該元素的迭代器。若不存在則返回s.end();
s.lower_bound(x)查詢大於等於x的元素中最小的一個並返回該元素的迭代器。
s.upper_bound(x)查詢大於x的元素中最小的一個並返回該元素的迭代器。
s.erase(it)從s中刪除迭代器it指向的元素時間複雜度為O(logn),s.erase(x)從s中刪除所有等於x的元素。
s.count(x)返回集合中等於x的元素個數。
set
for(i=0;i<=10;i++){
ss.insert(i);//將元素i插入到集合中時間複雜度為O(logn)
}
ss.insert(11);
ss.insert(12);
ss.insert(13);
set
cout<<endl;
se=ss.find(6);//查詢集合中等於 5的元素並返回該元素的迭代器 如果不存在則指向ss.end()
cout<<
ss.lower_bound(6);//查詢集合中大於等於5的元素中最小的一個,並指向該元素的迭代器
cout<<se<<endl;
ss.upper_bound(7);//查詢集合中大於5的元素中最小的一個,並指向該元素的迭代器
cout<<se<<endl;
for(se=ss.begin();se!=ss.end();se++){
cout<<*se<<" ";
}
cout<<endl;
int cnt=ss.count(5);//查詢ss中所有等於5的元素的個數
cout<<cnt<<endl;
ss.erase(5);//從ss中刪除所有等於5的元素
cout<<ss.count(5)<<endl;
ss.erase(se);//從ss中刪除迭代器se指向的元素
cout<<*se<<endl;
map容器
map容器是一個鍵值對key-value的對映,其內部實現一顆以key為關鍵碼的紅黑樹,map的key和value可以是任意型別,其中key必須定義小於號運算子。
函式定義
map<key_type,value_type) name;
map<int,int>name;
map<pair<int,int>,vector
庫函式
size/empty/clear/begin/end均與set類似
insert/erase與set類似,但其引數均是pair<key_type,key_type>
h.find(x)在變數名為h的map中查詢key為x的二元祖。
[ ]操作符,h[key] 返回key對映的value的引用。
map<int,int> vis;
vis.insert(pair<int,int>(0,22));
vis.insert(pair<int,int>(1,11));
vis.insert(pair<int,int>(2,33));
vis.insert(pair<int,int>(3,44));
for(i=4;i<10;i++)
vis.insert(pair<int,int>(i,i*11));
cout<<vis.size()<<endl;
for(i=0;i<vis.size();i++)
cout<<vis[i]<<" ";
cout<<endl;
vis.clear();//清除vis內的元素
cout<<vis.empty();//判斷vis是否為空