终于等到你

众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

C++ STL中的自定义排序和vector

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

posted @ 2019-10-23 11:55  gzr2018  阅读(1677)  评论(0编辑  收藏  举报