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的使用同理。