在地图中使用用户定义的类作为键

时间:2014-07-07 08:31:39

标签: c++

我定义了一个带有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;

        }
    }



}

1 个答案:

答案 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==或保留它们。