資料結構

建中 王培軒

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()
Made with Slides.com