优先队列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容器也适用迭代器