C++语法糖

C++一键导入所有标准库

#include<bits/stdc++.h>

sort()与匿名比较函数搭配

  • 与python的sort相似,第三个参数是传入比较函数,使用auto更具有鲁棒性。
    vector<vector<int>> myData; // myData中存储的为二维坐标(x, y)
    sort(myData.begin(), myData.end(), [](auto &a, auto&b){return a[1]> b[1];});
    
    上述写法等价于:
    vector<vector<int>> myData; // myData中存储的为二维坐标(x, y)
    auto comp = [](auto &a, auto &b){return a[1]>b[1];};
    sort(myData.begin(), myData.end(), comp);
    
  • 匿名函数的使用说明:https://www.cnblogs.com/yaya12138/p/11815475.html,简单总结如下
    • 函数结构包含[捕获列表](参数列表)->返回类型{函数体},其中->返回类型可以省略,编译器自动推断。
    • 可以看出匿名函数取消了c++对类型的限制,参数和返回值可以使用auto关键字。
    • 实验发现部分编译器的c++11标准会报错,使用--std=c++14才正常编译。

c++中重载比较运算的方式

  • 上面介绍了使用匿名函数来作为比较函数的方式。除了这种方式,还有如下等方式:
  1. 直接重载待排序元素自身的小于运算,这需要单独将元素自定义一个类。
    struct Data{
    	int x;
    	int y;
    	bool operator< (const Data &other) const {
    		return x < other.x;
    	}
    };
    vector<Data> myData;
    sort(myData.begin, myData.end);  // 此处不需要再传入比较函数
    
  2. 将上述匿名函数写为非匿名的函数。
    bool comp (const Data &p1, const Data&p2) const {
    		return p1.x < p2.x;
    } 
    vector<vector<int>> myData; // myData中存储的为二维坐标(x, y)
    sort(myData.begin(), myData.end(), comp);
    
  3. 写一个比较类Comp,并重载其中的括号运算,这样调用Comp comp对象时就相当于调用一个比较函数。
    struct Comp{
    	// 重载成员括号运算符,这个运算符相当于Python中的__call__函数。
    	bool operator() (const vector<int> &a, const vector<int> &b) { return a[1] < b[1];}
    };
    sort(myData.begin(), myData.end(), Comp());
    

优先队列中的较运算符

  • C++优先队列和sort()函数的的API定义分别为:
    template <class Alloc> priority_queue(const Compare& comp, const Alloc& alloc);
    
    template <class RandomAccessIterator, class Compare>
    void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
    
    //lambda初始化
    auto comp = [](ListNode* a, ListNode*b){return a->val > b->val;};
    priority_queue<ListNode*, vector<ListNode*>, decltype(comp)> Q(comp);
    
    
  • 两者之间有一个细微但重要的差别,就是Compare类的参数一个使用了引用,而后者没有使用引用。这导致优先队列的比较类参数不能为函数,使用起来相对麻烦。(请教了大佬说是C++历史遗留问题)。
  • 但是如果待比较元素自身定义了<运算符,就不需要在sort或优先队列初始化时传入comp参数

队列容器API

  • C++的接口如下。注意和python区分
// queue
q.push()
q.pop()
q.front()
q.back()

//priority_queue
q.push()
q.pop()
q.top()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值