zoukankan      html  css  js  c++  java
  • 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容器也适用迭代器

    不疯魔不成活
  • 相关阅读:
    c 开发调试汇总
    中级 makefile
    flex
    asp.net的一个重要发现(Page_Load()的执行次序先控件的事件函数)。
    Google App Engine(GAE)入门教程翻译
    类QQ右下角弹出消息对话框(jQuery插件)
    c#过滤HTML代码
    python源码分析2
    asp.net(C#) 编码解码(HtmlEncode与HtmlEncode)
    js操作html的table,包括添加行,添加列,删除行,删除列,合并单元格(未实现)
  • 原文地址:https://www.cnblogs.com/gzr2018/p/11725498.html
Copyright © 2011-2022 走看看