1.按key值排序
(第一个值,即<key,value>中的key值) 为了实现快速查找,map内部本身就是按序存储的(比如红黑树)。在我们插入<key, value>键值对时,就会按照key的大小顺序进行存储,其中key的类型必须能够进行 < 运算,且唯一,默认排序是按照从小到大便于记忆,可以联想到需要支持小于运算。 map的模板定义如下template < class Key, class T, class Compare = less, class Allocator = allocator > > class map;
其中第三、四个均包含默认参数,可以不指定。我们可以通过指定Compare类来指定排序的顺序。其中less是stl里面的一个函数对象(即调用操作符的类,其对象常称为函数对象(function object),它们是行为类似函数的对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类,其实质是对operator()操作符的重载)其具体定义如下
templatestruct less : binary_function { bool operator() (const T& x, const T& y) const {return x
它是一个带模板的struct,里面仅仅对()运算符进行了重载。与less相对的有greater,定义如下
templatestruct greater : binary_function { bool operator() (const T& x, const T& y) const {return x>y;} };
因此我们在定义map的时候,可以指定如下
map<string,int,greater > 或者定义自己的比较类comLen如下struct comLen{ bool operator(const string &lhs, const string &rhs) {return lhs.length()LenLessMap;
2.按value值排序
因为map不能用sort排序,所以先把map里的pair存到vector里,再用sort对vector排序,此时map里的顺序没变,要用vector才行。bool cmp(const pair& x, const pair & y) { return x.second > y.second; } void sortMapByValue(map & tMap,vector >& tVector) { for (map ::iterator curr = tMap.begin(); curr != tMap.end(); curr++) tVector.push_back(make_pair(curr->first, curr->second)); sort(tVector.begin(), tVector.end(), cmp); }
参考博客: