優先隊列priority_queue
優先隊列一般寫法
//隊列頭部值最小,小頂堆,每次top就是最小值,dijkstra堆優化就是小頂堆
priority_queue<int, vector<int>, greater<int> >pq;
//大頂堆,每次top就是最大值
priority_queue<int, vector<int>, less<int> >pq;與priority_queue<int>pq等價
自定義排序規則,用於自定義的數據結構,一個int滿足不了。
自定義()運算符,傳入兩個參數,內部寫> 實際上是從小到大排序與sort相反!
寫法一:
struct node
{
int to,cost;
};
struct cmp
{
bool operator() (const node &a,const node &b)
{
return a.cost > b.cost;
}
};
priority_queue<node,vector<node>,cmp>priq;
寫法二:
struct node
{
int to,cost;
node(int x1,int x2)
{
to=x1;
cost = x2;
}
friend bool operator<(const node &a , const node &b)
{
return a.cost>b.cost; // ascending sort
}
};
priority_queue<node>priq;
優先隊列的包裝函數多,一般是empty(),size(),pop(),top(),push()
set和multiset
以下介紹set,multiset用法類似
一般寫法
set<int>se
自定義排序
struct mynode {
int end, id;
};
struct rules
{
bool operator()(const mynode& a, const mynode& b)
{
return a.end < b.end;
}
};
set<mynode,rules> se;
set可以通過迭代器支持頭部刪除和尾部刪除(也就是一種支持可以刪除最值和動態更新的容器)
當然通過迭代器可以刪除任意位置的元素
//一些用法
se.erase(mset.begin());//刪除第一個
mset.erase(--mset.end());//刪除最后一個
vec.push_back((*(--mset.end())).id);//取出最后一個元素的某個部分
set和multiset用處還是挺大的,常用的也是insert(),erase()(值或者地址),size(),empty()之類的
支持迭代器遍歷。
vector
當然vector是數組,是向量,不能像上面那樣維護動態的平衡樹
這里介紹一下vector作為雙端隊列的使用,以及vector一些不常見的內置函數
// 任意位置插入一個元素
vector<int>::iterator it = vec.begin();
vec.insert(it, 2);
//任意位置插入 n 個相同元素
vec.insert(iterator it, int n, const T& x);
//插入另一個向量的 [forst,last] 間的數據
vec.insert(iterator it, iterator first, iterator last);
vec.resize(10)//會分配 10 個 0 給vec,相當於 push_back(0) 10 次。
push_back()//后面插入
pop_back()//彈出最后一個元素
back()//取出最后一個元素
vec.front();//取出第一個
vec.erase(iterator it);//任意位置刪除一個元素
vec.erase(iterator first, iterator last);//刪除 [first,last] 之間的元素
at 方法訪問:vec.at(1); // 和下標訪問區別就是 at 會檢查是否越界,是則拋出 out of range 異常
vector容器也適用迭代器