0

我已经定义了我的类SumClass并尝试在地图中使用它,如下面的代码所示。我已经定义了所需的<、===运算符。

#include <iostream>
#include <vector>
#include <map>

using namespace std;

class SumClass {
    public:
    int id;
    int sum;
    SumClass() { id = sum = 0;}
    bool operator<(const SumClass& rhs) const{
        if( (id < rhs.id) && (sum< rhs.sum)) return true;
        else return false;
    }
    bool operator==(const SumClass& rhs) const{
        //if(this == &rhs) return true;
        if( (id == rhs.id) && (sum == rhs.sum) ) return true;
        else return false;
    }
    void set(int idd, int summ) { id = idd; sum = summ; }
    SumClass& operator=(const SumClass& rhs){
        id = rhs.id;
        sum = rhs.sum;
        return *this;
    }
};

void test(){
    map<SumClass, int> m;
    SumClass temp;
    temp.set(0,3);
    m[temp] = -1;
    temp.set(-1, 3);
    m[temp] = -1;
    temp.set(-1, 2);
    m[temp] = -1;
    temp.set(0, 1);
    cout << "Test: " << m[temp] << endl;
}


int main(){
    test();
}

上面代码的输出是:“测试:-1”。但预期的输出是“测试:0”,因为我试图找到的 SumClass 元素在地图中不存在。谁能指出我做错了什么?

4

4 回答 4

5

operator<没有提供严格的弱排序

试试这个:

bool operator<(const SumClass& rhs) const{
  return std::tie(id, sum) < std::tie(rhs.id, rhs.sum);
}

或者,如果您不能使用 C++11 功能:

bool operator<(const SumClass& rhs) const{
  return std::make_pair(id, sum) < std::make_pair(rhs.id, rhs.sum);
}
于 2012-11-29T17:42:35.387 回答
2

您尚未定义所需的运算符;你operator<的不是严格的弱排序。

例如,(0, 0) < (1, 1),但既不(0, 0) < (0, 1)也不(0, 1) < (1, 1)成立,违反了等价的传递性。

有关如何编写严格的弱排序,请参阅Operator< 和严格的弱排序。

于 2012-11-29T17:43:50.630 回答
0

我怀疑这是错误的:

 bool operator<(const SumClass& rhs) const{
        if( (id < rhs.id) && (sum< rhs.sum)) return true;
        else return false;
    }

他们真的会一直保持这种关系吗?

于 2012-11-29T17:43:29.940 回答
0

map::operator[]正在尝试在地图中找到值。如果找到它,它会返回对它的引用。如果它没有找到它,那么它会创建它。您可以考虑使用map::find.

于 2012-11-29T17:45:49.740 回答