STL map 对结构体进行特定的排序
#include<iostream>
#include<map>
#include<algorithm>
#include<string>
using namespace std;
struct k
{
string name;
int id;
};
bool operator <(const k &x,const k &y)
{
if(x.id==y.id) 若id重了,则按姓名从小到大排序,否则,按id从大到小排序
return x.name<y.name;
else
return x.id>y.id;
}
int main()
{
freopen("2.txt","r",stdin);
map<k,int> a; //默认从小到大排序
int i,j,n,t;
string m;
k e;
cin>>n;
for(i=0;i<n;i++)
{
cin>>e.name>>e.id;
a.insert(make_pair(e,i+1));
}
for(map<k,int>::iterator it=a.begin();it!=a.end();it++)
cout << it->first.name<<" "<<it->first.id<<" "<<it->second<<endl;
return 0;
}
#include<iostream>
#include<map>
#include<algorithm>
#include<string>
using namespace std;
struct k
{
string name;
int id;
bool operator <(const k &x) const 再次印证了我的猜想,nice,nice,
{
if(x.id==id)
return x.name>name; 注意下面的大于号,和上面的为什么不同呢?
else
return x.id<id; 还有这,
}
}; 这大概就是个规律吧,解释不清的时候,会用就好。
int main()
{
freopen("2.txt","r",stdin);
map<k,int> a; //默认从小到大排序
int i,j,n,t;
string m;
k e;
cin>>n;
for(i=0;i<n;i++)
{
cin>>e.name>>e.id;
a.insert(make_pair(e,i+1));
}
for(map<k,int>::iterator it=a.begin();it!=a.end();it++)
cout << it->first.name<<" "<<it->first.id<<" "<<it->second<<endl;
return 0;
}
如果改为前者那样,
我们可以测试一下,