地图中结构键的比较运算符C++

Comparison Operator for Structure key in C++ Map

本文关键字:比较 运算符 C++ 结构 地图      更新时间:2023-10-16
#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 == yy == 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>