STL中使用映射(map)时,常常希望能够根据自己的需要进行排序,排序的方法进行如下整理:
一、对key值进行特定的排序
map
容器里面有两个值一个key
一个是value
,map<key,value>
,其实map
里面还有第三个参数,是一个类,用来对map
的key
进行排序的类,定义如下
template<class _Kty,
class _Ty,
class _Pr = less<_Kty>,
class _Alloc = allocator<pair<const _Kty, _Ty> > >
class map
less<_Kty>的代码
struct less
: public binary_function<_Ty, _Ty, bool>
{ // functor for operator<
bool operator()(const _Ty& _Left, const _Ty& _Right) const
{ // apply operator< to operands
return (_Left < _Right);
}
};
那么根据上面的代码我们也可以写出一个greater类来让key按照降序排列
#include <iostream>
using namespace std;
#include <map>
class MyCompare {
public:
bool operator()(int v1, int v2) const
{
return v1 > v2;
}
};
void test01()
{
//默认从小到大排序
//利用仿函数实现从大到小排序
map<int, int, MyCompare> m;
m.insert(make_pair(1, 10));
m.insert(make_pair(2, 30));
m.insert(make_pair(3, 50));
m.insert(make_pair(4, 20));
m.insert(make_pair(5, 40));
for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key:" << it->first << " value:" << it->second << endl;
}
}
int main() {
test01();
system("pause");
return 0;
}
以上就对key值进行了你想要的排序方式。
二、对value的值进行排序
因为map
的模板里面没有对value
的值进行排序的参数,所以只能借助sort
函数,然而sort
函数只能对vector,list,queue
等排序,无法对map
排序,那么就需要把map
的值放入vector
中在对vector
进行排序,在对vector
进行输出,从而间接实现了对map
的排序。sort
也有第三个参数,跟上面那个map
类似,所以可以写一个类或者函数来将其排序。
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<string, int> PAIR;
bool cmp_val(const PAIR &left,const PAIR &right)
{
return left.second < right.second;
}
int main()
{
map<string, int> ma;
ma["Alice"] = 86;
ma["Bob"] = 78;
ma["Zip"] = 92;
ma["Stdevn"] = 88;
vector<PAIR> vec(ma.begin(),ma.end());
sort(vec.begin(),vec.end(),cmp_val);
for (vector<PAIR>::iterator ite = vec.begin(); ite != vec.end(); ++ite)
{
cout << ite->first << " " << ite->second << endl;
}
getchar();
}
这样就通过cmp_val
函数对vector
进行了排序,然后在将其输出即可。
如果感觉写函数过于繁琐也可以直接在sort
里面用lambda
表达式,代码如下
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<string, int> PAIR;
int main()
{
map<string, int> ma;
ma["Alice"] = 86;
ma["Bob"] = 78;
ma["Zip"] = 92;
ma["Stdevn"] = 88;
vector<PAIR> vec(ma.begin(),ma.end());
sort(vec.begin(), vec.end(),[](const PAIR &left, const PAIR &right)
{
return left.second < right.second;
});
for (vector<PAIR>::iterator ite = vec.begin(); ite != vec.end(); ++ite)
{
cout << ite->first << " " << ite->second << endl;
}
getchar();
}