地图中结构键的比较运算符C++
Comparison Operator for Structure key in C++ Map
#include<bits/stdc++.h>
using namespace std;
struct segment{
int a;
int b;
int c;
bool const operator<(const segment &o) const {
return a < o.a;
}
};
int main()
{
map<segment,int> myMap;
map<segment,int>::iterator it;
struct segment x,y,z;
x.a=2;
x.b=4;
x.c=6;
y.a=2;
y.b=5;
y.c=8;
z.a=2;
z.b=4;
z.c=6;
myMap[y]++;
myMap[z]++;
myMap[x]++;
for( it =myMap.begin(); it != myMap.end(); it++)
cout<<(*it).first.a<<" "<<(*it).second<<endl;
return 0;
}
它给出的结果为
2 3
但我希望它打印
2 1
2 2
简而言之,如果输入完全相同的结构实例而不是制作新副本,我想增加映射的值
IMO 比较多个成员的最佳方法是使用 std::tie
,因为它更难搞砸:
bool const operator<(const segment &o) const {
return std::tie(a, b, c) < std::tie(o.a, o.b, o.c);
}
编辑:只想将此链接添加到cpp首选项,因为示例几乎正是您的问题。
您可以将 less 运算符更改为:
bool const operator<(const segment &o) const {
return a < o.a || (a == o.a && b < o.b) || (a==o.a && b==o.b && c < o.c) ;
}
这将按 a、b、c 的顺序比较值。
但是你可以改变它,无论如何你想比较结构。
就
您的map
而言,这里只有一个唯一的对象。就您指定的比较和隐含等价而言,x == y
和y == z
.为什么?它们都不比另一个小,因此,根据 STL 逻辑,它们必须是等效的。
也许您正在寻找std::multimap
.
或者,如果你想根据所有成员来定义不等式(因此隐含的等价),你可以做这样的事情:
#include <tuple>
bool const operator<(const segment &o) const {
return std::make_tuple(a, b, c) < std::make_tuple(o.a, o.b, o.c);
}
附言你应该避免包含来自bits
的东西,因为你包含来自实现的东西。相反,尝试使用类似的东西
// See? no bits.
#include <map>
相关文章:
- 为什么比较运算符如此快速
- 布尔比较运算符是如何在C++中工作的
- 关于 std::min, std::max 中的比较运算符的混淆
- 三向比较运算符成员与非成员实现
- 标准::可选枚举的比较运算符
- C++分数混合比较运算符错误
- 不能将重载比较运算符与 Catch 测试一起使用
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么我的比较运算符不比较我的点长和双精度值?
- 高效简单的结构比较运算符
- 如何实现 Boost.Hana 结构的相等比较运算符?
- 为什么sub_match和basic_string比较运算符使用额外的字符串副本实现?
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- 在priority_queue的自定义类中重载比较运算符
- 为什么C++容器之间存在比较运算符
- 尝试使用比较运算符对对象向量进行排序
- C++复合逻辑运算符不使用比较运算符
- C++:比较运算符>和字符串文本的意外结果
- 重载对象成员的比较运算符
- 比较运算符==中的对象指针