总结一下结构体的sort和priority_queue比较函数写法。两者可以区别对待,也可以统一。统一的话就直接在结构体中重载小于符号即可,参见最后一个标题下的内容。
sort
sort的比较函数就真的可以只是一个函数:
bool myfunction (T i, T j) { return (i.val<j.val); }
int main () {
vector<T> myvector = //...;
// 用布尔函数来充当比较函数
std::sort (myvector.begin(), myvector.end(), myfunction);
}
当然也可以写匿名函数:
int main () {
vector<T> myvector = //...;
// 用布尔函数来充当比较函数
std::sort (myvector.begin(), myvector.end(), [](T i, T j) {return i.val < j.val;});
}
另外,也可以用一个重载小括号运算符的对象来充当比较函数:
struct myclass {
bool operator() (T i,T j) { return (T.i<T.j);}
} myobject;
int main () {
vector<T> myvector = // ...;
// 用重载小括号运算符的对象来充当比较函数
std::sort (myvector.begin(), myvector.end(), myobject);
}
priority_queue
而优先队列(堆)的比较函数则需要是一个重载小括号运算符的类(或者结构体,事实上C++中结构体就是一种类)
class big
{
bool operator() (const T &i, const T &j) const
{
return (i.val < j.val);
}
};
class small
{
bool operator() (const T &i, const T &j) const
{
return (i.val > j.val);
}
};
int main ()
{
// 用重载小括号运算符的类充当比较函数,此处是大根堆
priority_queue<T,vector<T>,big> big_heap;
// 用重载小括号运算符的类充当比较函数,此处是小根堆
priority_queue<T,vector<T>,small> smal_heap;
}
两者通用,不传入比较函数的方式
在结构体内重载小于运算符
struct T{
int a, b;
bool operator<(const T &w) const{
return a < w.a;
}
};
int main ()
{
vector<T> Ts = // ...;
// 不用传入比较函数,升序排序
sort(Ts.begin(), Ts.end());
// 不用传入比较函数,大根堆
queue_priority<T> big_heap;
}
这种写法在算法题中常用,我个人比较喜欢。例子:LeetCode 1792