C++一键导入所有标准库
#include<bits/stdc++.h>
sort()与匿名比较函数搭配
- 与python的sort相似,第三个参数是传入比较函数,使用auto更具有鲁棒性。
vector<vector<int>> myData;
sort(myData.begin(), myData.end(), [](auto &a, auto&b){return a[1]> b[1];});
上述写法等价于:vector<vector<int>> myData;
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++中重载比较运算的方式
- 上面介绍了使用匿名函数来作为比较函数的方式。除了这种方式,还有如下等方式:
- 直接重载待排序元素自身的小于运算,这需要单独将元素自定义一个类。
struct Data{
int x;
int y;
bool operator< (const Data &other) const {
return x < other.x;
}
};
vector<Data> myData;
sort(myData.begin, myData.end);
- 将上述匿名函数写为非匿名的函数。
bool comp (const Data &p1, const Data&p2) const {
return p1.x < p2.x;
}
vector<vector<int>> myData;
sort(myData.begin(), myData.end(), comp);
- 写一个比较类Comp,并重载其中的括号运算,这样调用Comp comp对象时就相当于调用一个比较函数。
struct Comp{
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);
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
// queue
q.push()
q.pop()
q.front()
q.back()
//priority_queue
q.push()
q.pop()
q.top()