map/set容器的运算符重载比较函数的易错点
//观察下列程序//Sample Input:/*5aa 89bb 76cc 87dd 89ee 76*///你觉得会输出什么???#include#include#include#include#include#include#include#define MAXN 10010#define RST(N
·
//观察下列程序
//Sample Input:
/*
5
aa 89
bb 76
cc 87
dd 89
ee 76
*/
//你觉得会输出什么???
结果很变态,很猥琐,很无耻!!!哈哈,玩笑
Sample Outout:
aa : 89
cc : 87
bb : 76
解析:因为map函数是采用红黑树实现的,红黑树中不允许有重复键值的节点存在,也就是说,当你要往
红黑树中添加一个节点时,如果map检测到树中有相同键值的话,他将不会将此节点插入到树中;而插入节点的规则就是由你自己根据情况定义的;也就是我们自定义的比较函数。
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容器里,与其他属性无关。
其实最主要的要注意的是:自定义的比较函数!!!
//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容器里,与其他属性无关。
其实最主要的要注意的是:自定义的比较函数!!!
更多推荐
已为社区贡献3条内容
所有评论(0)