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);
}