//观察下列程序
//Sample Input:
/*
5
aa 89
bb 76
cc 87
dd 89
ee 76
*/
//你觉得会输出什么???

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <map>
#include <algorithm>
#define MAXN 10010
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

struct Node
{
    string name;
    float score;
    bool operator < (const Node &a) const
    {
        return a.score < score ;
    }
};

map <Node, int> mp;
map <Node, int> :: iterator _it;
map <Node, int> :: reverse_iterator _rit;

int main()
{
    int n;
    Node N;
    while(cin >> n) {
	mp.clear();
        for(int i=0; i<n; i++) {
            cin >> N.name >> N.score;
            mp[N]++;
        }
        for(_it=mp.begin(); _it!=mp.end(); _it++) {
            cout << (_it->first).name << " : " << (_it->first).score << endl;
        }
    }
    return 0;
}


结果很变态,很猥琐,很无耻!!!哈哈,玩笑
Sample Outout:
aa : 89
cc : 87
bb : 76

解析:因为map函数是采用红黑树实现的,红黑树中不允许有重复键值的节点存在,也就是说,当你要往
红黑树中添加一个节点时,如果map检测到树中有相同键值的话,他将不会将此节点插入到树中;而插入节点的规则就是由你自己根据情况定义的;也就是我们自定义的比较函数。

struct Node
{
    string name;
    float score;
    bool operator < (const Node &a) const
    {
        return a.score < score ;
    }
};

return a.score < score; // 关键

这条语句指令说明将节点按score从大到小添加进容器中,隐含的说明就是,当碰到相同的节点的时候(也就是当前节点的score值等于map容器中某个节点的score值时),当前这个节点将不会加入到ma容器中,但是,最需要注意的情况就是:
如上情况输入:
3
aa 98
bb 98
aa 78

输出是:
aa 98
aa 78

也就是score值不等,但是这个节点的除score属性的其他属性值相等的情况,map容器的处理规则就是:只要关键比较键值不相等,map就会将此节点添加进map容器里,与其他属性无关。

其实最主要的要注意的是:自定义的比较函数!!!
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐