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