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();
}

上記のコードの出力は、"Test: -1" です。しかし、検索しようとしている SumClass 要素がマップに存在しないため、予想される出力は "Test: 0" です。誰かが私が間違っていることを指摘できますか?

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 に答える