我已经定义了我的类 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/