C++地图行为不正常
C++ map not behaving properly
我已经定义了我的类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"。但是预期的输出是"Test: 0",因为我试图查找的 SumClass 元素在映射中不存在。谁能指出我做错了什么?
您的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);
}
您尚未定义所需的运算符;您的operator<
不是严格的弱排序。
例如,(0, 0) < (1, 1)
,但(0, 0) < (0, 1)
和(0, 1) < (1, 1)
都不成立,违反了等价的传递性。
请参阅运算符<和严格弱排序,了解如何编写严格的弱排序。>
我怀疑这是错误的:
bool operator<(const SumClass& rhs) const{
if( (id < rhs.id) && (sum< rhs.sum)) return true;
else return false;
}
他们真的总是会有这种关系吗?
map::operator[]
正在尝试在映射中查找值。如果找到它,它将返回对它的引用。如果找不到它,那么它会创建它。您可以考虑使用 map::find
.
相关文章:
- C++中的memset函数工作不正常
- 通用线程池类工作不正常
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- 为什么不插入地图?
- 名为DLL的C++windows服务程序工作不正常
- C++-循环中的If语句工作不正常
- While循环和if/else语句工作不正常
- 如何将地图作为不可变地图传递?
- Qthread ::更改系统时间时睡眠不正常
- 阵列中的元素不正常地变化
- C++:最大数组值函数工作不正常
- 工会工作不正常
- 为什么这个循环运行不可见的代码?工作不正常
- C++STL映射键和值工作不正常
- C++地图行为不正常
- c++文件指针工作不正常
- do while循环工作不正常
- qdbusxml2cpp工作不正常
- 阵列初始化工作不正常