cmp的运用

sort函数:

在做题时我们经常会碰到排序问题,有的题目要求从大到小排序,但是如果有大小相同的序号小的排在前面,当我们想用sort函数直接排序时,我们如果用

sort(a.rbegin(),a.rend());

我们会发现有相同的值时,序号大的会排在前面。这时我们就可以用cmp来实现该排序。

在不用cmp的情况:

vector<pii>p(5);
pii a[5] = { {1,1},{2,2},{2,3},{3,4},{4,5} };

bool cmp(pii a, pii b)
{
	if (a.first == b.first)return a.second < b.second;
	else return a.first > b.first;
}

void solve()
{
	for (int i = 0; i < 5; i++)
		p[i] = a[i];
	sort(p.rbegin(), p.rend());
	for (auto i : p)
		cout << i.first << ' ' << i.second << endl;
}

 输出的结果为:

使用了cmp后: 

vector<pii>p(5);
pii a[5] = { {1,1},{2,2},{2,3},{3,4},{4,5} };

bool cmp(pii a, pii b)
{
	if (a.first == b.first)return a.second < b.second;
	else return a.first > b.first;
}

void solve()
{
	for (int i = 0; i < 5; i++)
		p[i] = a[i];
	sort(p.begin(), p.end(), cmp);
	for (auto i : p)
		cout << i.first << ' ' << i.second << endl;
}

这时输出的结果为:

 显然第一种不符合条件,第二种符合。

sort函数使用cmp时的一般格式为:

bool cmp(int a,int b)
{
	return a > b;//从大到小排序,如果要从小到大排序将>改为<即可。
}

map函数:

不仅如此,诸如map,set等都可以用cmp。

例如有的题目给你一个数组,要求你统计其中每个数出现次数,数组中的数从按大到小的顺序输出答案,我们如果直接用map来存储

for(int i=0;i<n;i++)
     p[a[i]]++;//a[i]为数组中的数,p存储数出现的次数。

map会自动的将数按从小到大的顺序排列。

int a[5] = { 1,1,2,2,3 };
map<int, int>p;

void solve()
{
	for (int i = 0; i < 5; i++)
		p[a[i]]++;
	for (auto i : p)
		cout << i.first << ' ' << i.second << endl;
}

输出为:

 

此时如果我们直接输出的话与答案要求的不符,这时我们就可以用cmp。

int a[5] = { 1,1,2,2,3 };

struct cmp 
{
	bool operator ()(int a, int b)const
	{
		return a > b; 
	}
};

void solve()
{
	map<int, int, cmp>p;
	for (int i = 0; i < 5; i++)
		p[a[i]]++;
	for (auto i : p)
		cout << i.first << ' ' << i.second << endl;
}

输出为:

这时就可以满足题目条件了。

map使用cmp的一般格式为:

struct cmp 
{
	bool operator ()(int a, int b)const
	{
		return a > b; 
	}
};

 set的cmp的使用同理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值