C++ sort
sort是C++ STL(Standard template library)提供的排序函数,它可以为普通函数或者容器中指定范围内的元素进行排序。默认为升序排序,排序的区间左闭右开。
使用标准库(STL)提供的比较规则
vector<int> a(n);
//....
sort(a.begin(), a.end(), less<int>());//从小到大
sort(a.begin(), a.end(), greater<int>());//从大到小
priority_queue<int, vector<int> ,less<int> >q;//从大到小排序,注意优先队列是反的
less
与greater
的意思是两个要比较的元素中,第一个元素是否比第二个元素更小(less)或更大(greater)。
less
与greater
实际上是模板结构体,即sort的第三个参数可以是类对象。
template<typename _Tp>
struct less : public binary_function<_Tp, _Tp, bool>
{
_GLIBCXX14_CONSTEXPR
bool
operator()(const _Tp& __x, const _Tp& __y) const
{ return __x < __y; }
};
template<typename _Tp>
struct greater : public binary_function<_Tp, _Tp, bool>
{
_GLIBCXX14_CONSTEXPR
bool
operator()(const _Tp& __x, const _Tp& __y) const
{ return __x > __y; }
};
自定义比较规则
自定义比较规则多用函数实现
const bool mycmp(int a, int b)
{
return a < b;//升序
}
sort(a.begin(), a.end(), mycmp);
当然也可以仿照上面的规则使用结构体或类对象作为sort的第三个参数。
sort排序pair
pair有自带的排序规则,其默认对first升序,当first相同时对second升序;
我们可以增加第三个参数来改变排序规则
vector<pair<int, char>> b(n);
sort(b.begin(), b.end(), greater<pair<int, char>>());//从大到小
const bool mycmp(const pair<int, char> a, const pair<int, char> b)
{
return a.first != b.first ? a.first < b.first : a.second > b.second;
}
sort(b.begin(), b.end(), mycmp);
用lambda自定义比较规则
sort(a.begin(), a.end(), [](int x, int y)
{
return x < y;
});
[]里的参数为空,因为除x,y之外不需要额外的参数。