資料結構
建中 王培軒
STL
#include<bits/stdc++.h>
using namespace std;
唯一指名
Iterator
迭代器,與pointer類似,指向container裡的某個東西
通常可以用prev(it),next(it),it++,it--等等取前一個或後一個
在非線性資料結構不能直接it+3之類的
vector
又稱dynamic array,可以動態開記憶體
(在各種程式語言都有這個概念)
vector<T> v; //T是任意型別, 如int, float, long long
v.push_back(x); //在v的結尾加入x,會自動配置空間
v[i]=x; //直接指定或取值,前提是要有
v.size() //取得大小
v.resize(n); //將大小變成n,空位補0
sort(v.begin(),v.end()); //由小到大排序
lower_bound(v.begin(),v.end(),x) //回傳第一個大於等於x的iterator,vector需先sort好
upper_bound(v.begin(),v.end(),x) //回傳第一個大於x的iterator,vector需先sort好
int ind=lower_bound(v.begin(),v.end(),x) - v.begin() //常用方法
用法
如何由大到小排序
bool cmp(int a,int b){
return a>b;
}
sort(v.begin(),v.end(),cmp);
//或
sort(v.begin(),v.end(),[](int a,int b){return a>b;});
//lambda function, C++14
stack
FILO:First In Last Out
用法
stack<T> st; //T是任意型別
st.push(x); //推入x
st.top() //回傳最頂的數字
st.pop(); //從最上面推一個出來
st.size() //回傳大小
st.empty() //回傳布林值,是否為空
你也可以...
int stk[1000005],top=-1;
stk[++top]=x; //push(x)
stk[top] //top()
top--; //pop()
top //size
queue
FIFO: First In First Out
用法
queue<T> q;
q.push(x);
q.pop();
q.size();
q.empty();
deque
與queue很像,只是可以從頭尾push跟pop!
用法
deque<T> q;
q.push_front(x);
q.pop_front();
q.push_back();
q.pop_back();
q.size();
q.empty();
set
集合!
可以插入東西,然後快速查詢有沒有在裡面!(\(O(\log n)\))
內部實作為紅黑樹
用法
set<T> s;
s.insert(x); //插入
s.find(x) //回傳x的iterator,如果沒有會回傳s.end();
if(s.find(x)!=s.end()){} //常用判斷式
s.count(x) //只會有0或1個
if(s.count(x)!=0) //常用判斷式
s.erase(x); //刪除,參數也可以是iterator
for(auto it=s.begin();it!=s.end();it++){} //遍歷整個set,會照順序
s.lower_bound(x) //回傳大於等於x的最小值的iterator,若無回傳s.end()
s.upper_bound(x) //回傳大於x的最小值的iterator,若無回傳s.end()
s.size()
s.empty()
Caution!
set中每個值相同的東西只能出現一次,
插入時如果已經有了就不會再插入
multiset
每一個東西可以有很多個!
multiset<T> s; //大部分用法與set相同
s.erase(x); //將所有值為x的刪掉
s.erase(s.lower_bound(x)) //刪掉一個值為x的
map
將一些東西一對一映射到另外一些東西!
(插入、查詢:\(O(\log n)\))
兩者都可以是任意型別!
內部也是紅黑樹
用法
map<T1,T2> ma; //T1, T2為任意型別
ma[a]=b; //指定值,若沒有則插入
ma.insert({a,b}); //key為a, value為b
ma.erase(a); //刪除key為a的值
ma.lower_bound(a);
ma.upper_bound(a); //對key的域二分搜
if(ma[a]) //可判斷有無在map中
for(auto it=ma.begin();it!=ma.end();it++){
cout << it->first << '\n'; //a
cout << it->second << '\n'; //b
}
ma.size()
ma.empty()
priority_queue
每次取頂部會取到最(大、小、好、壞...)的那個!
類似stack!
(雖然他叫queue)
用法
priority_queue<T> pq;
pq.push(x);
pq.top();
pq.pop();
pq.empty()
資料結構
By peter940324
資料結構
- 193