在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort
方法。
#include
#include
int main()
{
int array[] = {
4,1,8,5,3,7,0,9,2,6};
// 默认按照小于比较,排出来结果是升序
std::sort(array, array+sizeof(array)/sizeof(array[0]));
// 如果需要降序,需要改变元素的比较规则
std::sort(array, array + sizeof(array) / sizeof(array[0]), greater<int>());
return 0;
}
如果待排序元素为自定义类型,需要用户使用仿函数定义排序时的比较规则:
struct Goods
{
string _name; //名字
double _price; //价格
int _num; //数量
};
struct ComparePriceLess
{
bool operator()(const Goods& g1, const Goods& g2)
{
return g1._price < g2._price;
}
};
struct ComparePriceGreater
{
bool operator()(const Goods& g1, const Goods& g2)
{
return g1._price > g2._price;
}
};
struct CompareNumLess
{
bool operator()(const Goods& g1, const Goods& g2)
{
return g1._num < g2._num;
}
};
struct CompareNumGreater
{
bool operator()(const Goods& g1, const Goods& g2)
{
return g1._num > g2._num;
}
};
int main()
{
vector<Goods> v = {
{
"苹果", 2.1, 300 }, {
"香蕉", 3.3, 100 }, {
"橙子", 2.2, 1000 }, {
"菠萝", 1.5, 1 } };
sort(v.begin(), v.end(), ComparePriceLess()); //按价格升序排序
sort(v.begin(), v.end(), ComparePriceGreater()); //按价格降序排序
sort(v.begin(), v.end(), CompareNumLess()); //按数量升序排序
sort(v.begin(), v.end(), CompareNumGreater()); //按数量降序排序
return 0;
}
仿函数是重载了operator()
的类,仿函数确实能够解决这里的问题,但可能仿函数的定义位置可能和使用仿函数的地方隔得比较远,这就要求仿函数的命名必须要通俗易懂,否则会降低代码的可读性。对于这种场景就比较适合使用lambda表达式。
lambda表达式首先是一个可调用对象,是一个无名函数,一个lambda表达式可以被赋值给std::function
对象,或者直接使用auto类型推导。std::function
是一个通用的函数封装器,它可以包装任意可调用对象,包括函数指针、函数对象、成员函数指针以及lambda表达式。
int main()
{
vector<Goods> v = {
{
"苹果", 2.1, 5 }, {
"香蕉", 3, 4 },