今天在跟着黑马程序员的视频教程进行c++中map的排序练习,map输出的时候是默认升序输出的,如果想要实现map的降序输出,就需要写一个仿函数来改变默认排序规则,在map构造函数中添加一个自定义的类,在类中定义仿函数。
map<int,int,myCompare>
class myCompare
{
public:
bool operator()(int v1, int v2)
{
//降序
return v1 > v2;
}
};
然后进行降序输出:
void test03()
{
map<int, int, myCompare>m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(5, 50));
m.insert(pair<int, int>(0, 0));
m.insert(make_pair(4, 40));
m.insert(make_pair(3, 30));
m.insert(make_pair(2, 20));
for (map<int, int, myCompare>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "key= " << (*it).first << " value= " << (*it).second << endl;
}
}
运行之后竟然出现了以下错误:
错误C3848:具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool MyCompare::operator ()(int,int)
就很奇怪,代码和视频中一致,但是视频里却能够正常运行。可能是因为我用的visual studio2019,视频里用的是老版本,在编译检查上增加了一些新的规则?为了定位问题,从源码排查一下:
转到定义,找到了map的一条构造函数:
template <class _Iter>
map(_Iter _First, _Iter _Last, const key_compare& _Pred) : _Mybase(_Pred) {
insert(_First, _Last);
}
构造函数中,_First 即为 key ,_Last 即为 value 。而 key_compare 被限定为 const 类型,因此我们在为 map 传入参数的时候,仿函数也应该为 const 类型,因此解决方案如下:在仿函数的后面加上关键字 const ,使得 myCompare 作为参数的时候具有 const属性。
class myCompare
{
public:
bool operator()(int v1, int v2) const
{
//降序
return v1 > v2;
}
};
运行成功!