我定义了一个带有2个整数值a和b的类Entry,以及一个Entry'e'的向量。现在,我将定义一个映射'm'的Entry和int,其中int是条目在向量中出现的时间。事物是find函数正在考虑Entry(1,2),Entry(1,12)和Entry(1,13)作为一个。当a和b相等时,两个条目应该相同。但是,如果只有a等于它,则将两个条目视为相同。
#include<iostream>
#include<map>
#include<vector>
using namespace std;
class Entry{
public:
int a;
int b;
Entry(int,int);
bool operator <(Entry);
bool operator >(Entry);
bool operator ==(Entry);
};
Entry::Entry(int x,int y):a(x),b(y){
}
bool Entry::operator ==(Entry e){
if(a==e.a && b==e.b)
return true;
else
return false;
}
bool Entry:: operator <(Entry e){
if(a<e.a)
return 1;
else
return 0;
}
bool Entry:: operator >(Entry e){
if(a>e.a)
return 1;
else
return 0;
}
int main(){
map<Entry,int> m;
vector<Entry> e;
e.push_back(Entry(1,2));
e.push_back(Entry(10,21));
e.push_back(Entry(1,13));
e.push_back(Entry(1,2));
e.push_back(Entry(1,12));
for(int i=0;i<e.size();i++){
if(m.find(e[i])==m.end())
m[e[i]]=1;
else{
m[e[i]]=m[e[i]]+1;cout<<e[i].a<<" "<<e[i].b<<" "<<m[e[i]]<<endl;
}
}
}
答案 0 :(得分:2)
std::map
正在使用关系运算符<
来排序和检查密钥唯一性。由于operator<
的实现只使用a
成员进行比较,因此在评估密钥相等时会忽略b
。地图界面中未使用operator==
- 它由!(a < b || b < a)
替换。你需要像
bool Entry::operator<(const Entry& e){
return a < e.a || a == e.a && b < e.b;
}
如果您出于其他目的需要,可以删除operator>
和operator==
或保留它们。