C++ 映射行为不正常

标签 c++ data-structures stl dictionary

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

#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”。但预期的输出是“Test: 0”,因为我试图查找的 SumClass 元素不存在于 map 中。谁能指出我做错了什么?

最佳答案

你的 operator<不提供 strict weak ordering .

试试这个:

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

关于C++ 映射行为不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13631526/

相关文章:

c++ - 对象指针的 vector 在 C++ 中似乎没有按预期执行

c++ - 为什么 unordered_map 和 map 提供相同的性能?

algorithm - 有没有总结描述 "real-life"各种数据结构的应用?

c++ - 通过 operator[] 和 .at() 访问 vector 的负索引

c++ - 配对无序字符串作为 unordered_map 的键

c++ - 按引用返回与按值返回。 C++

c++ - 将多个元组应用于同一个函数(即 `apply(f, tuples...)` )而不递归或 `tuple_cat`

c++ - 如何在 LLVM 模块中增加全局变量?

algorithm - 图吞吐量算法

c++ - STL 中不必要的锁定? (Visual C++ Express)