C++关于greater和less

本文详细解释了greater和less函数在C++中的作用,它们是仿函数,用于算法和容器的比较。重点介绍了在不同场景下的使用,如sort、set等的升序降序排列,以及priority_queue的特殊性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

greater和less相关的细碎知识总是会忘记,所以这里记一篇用来保存

greater和less是函数对象,也就是仿函数,是一个类,其中包含了一个bool operator()

greator和less常用于算法和容器的比较函数,比如sort、set、map、multiset、multimap,priority_queue

template<class T>
struct greater
{
	bool operator()(const T& e1, const T& e2) const //注意这里有const
	{
		return e1 > e2;//greater ———— e1 大于 e2 
	}
};

template<class T>
struct less
{
	bool operator()(const T& e1, const T& e2) const
	{
		return e1 < e2;//less ———— e1 小于 e2
	}
}

上面我们需要注意的就是return时的比较,这个最好直接记住greater对应e1大于e2,less对应e1小于e2

对于我们使用的容器和算法,比如map set sort都是使用的less作为比较器,对于排序结果来说,是升序排列

所以我们需要记住:

less < 升序
greater > 降序

不过有一个例外,priority_queue,优先级队列底层排序用的是堆的结构,在建堆的过程中,默认less函数对象在向下调整的时候找到的是更大的数,也就让更大的数交换到了index更小的位置,也就是说,呈现出了降序排列(在top()、pop()的时候就是swap(_con[0], _con[size - 1]) 然后size-- )

less < 降序 priority_queue 大堆
greater > 升序 priority_queue 小堆

使用标准库中的 graeter< T > less< T > ,标准库中的函数可以直接使用,不需要包头文件
sort()函数中作为参数,这里的参数需要是变量、对象

void test3()
{
	int arr[] = { 1, 5, 2, 3, 4 };
	vector<int> v(arr, arr + 5);
	
	sort(v.begin(), v.end(), greater<int>());//注意greater<int>是仿函数类型,greater<int>()是创建了一个临时对象
	//greater<int> cmp;//创建一个仿函数对象
	//sort(v.begin(), v.end(), cmp);//用这个对象,作为第三个比较函数
	
	for (auto e : v)
	{
		cout << e << " "; // 5 4 3 2 1
	}
	cout << endl;
}

map…容器中作为模板参数,这里的参数是类型

void test4()
{
	map<string, int, less<string>> Mymap;//注意是类型,less<string>是类型,仿函数类型
	Mymap.insert(make_pair("epple", 7));
	Mymap.insert(make_pair("apple", 3));
	Mymap.insert(make_pair("cpple", 10));
	for (auto e : Mymap)
	{
		cout << e.first << ": " << e.second << endl;
	}
	cout << endl;
	
	
	priority_queue<int, vector<int>, greater<int>> pq;//priority_queue是适配器,比较函数参数是在第三个,必须把第二个适配的容器vector<int>先写上,再选择使用greater<int>还是less<int>
	pq.push(3);
	pq.push(10);
	pq.push(5);
	pq.push(1);
	
	while (!pq.empty())
	{
		cout << pq.top() << " ";//1 3 5 10
		pq.pop();
	}
	cout << endl;
	
}

使用自己写的Less Greater仿函数,这里用大写开头是为了与库中的less、greater分辨

template<class T>
struct Greater
{
	bool operator()(const T& e1, const T& e2) const //注意const
	{
		return e1 > e2;
	}
};
template<class T>
struct Less
{
	bool operator()(const T& e1, const T& e2) const
	{
		return e1 < e2;	
	}
}
void test3()
{
	int arr[] = { 1, 5, 2, 3, 4 };
	vector<int> v(arr, arr + 5);
	
	sort(v.begin(), v.end(), Greater<int>());//注意Greater<int>是仿函数类型,Greater<int>()是创建了一个临时对象
	//Greater<int> cmp;//创建一个仿函数对象
	//sort(v.begin(), v.end(), cmp);//用这个对象,作为第三个比较函数
	
	for (auto e : v)
	{
		cout << e << " "; // 5 4 3 2 1
	}
	cout << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失去梦想的小草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值