#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
简而言之,如果输入完全相同的结构实例而不是制作新副本,我想增加地图的值
答案 0 :(得分:6)
IMO比较多个成员的最佳方法是使用bool const operator<(const segment &o) const {
return std::tie(a, b, c) < std::tie(o.a, o.b, o.c);
}
,因为它更难搞乱:
select out.name, in from (traverse * from #01:01 while $depth <=3) where in=#01:02
修改:我想将此链接添加到cppreference作为示例,几乎就是您的问题。
答案 1 :(得分:1)
就您的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);
}
P.S。您应该避免包含来自bits
的内容,因为您要包含实施中的内容。相反,尝试使用像
// See? no bits.
#include <map>
答案 2 :(得分:1)
您可以将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的顺序比较值。
但是无论如何你都可以改变它来比较结构。