C++ 重载运算符<;对于多字段类

C++ 重载运算符<;对于多字段类,c++,stl,map,operator-overloading,C++,Stl,Map,Operator Overloading,我试图插入一个映射,其中键是一个类。我在类中重载了运算符

我试图插入一个映射,其中键是一个类。我在类中重载了运算符<函数,如下所示:

struct MyType
{
    int a, b, c;
    bool operator<(const MyType& Rhs) const
    {
       return (a<Rhs.a) || (b<Rhs.b) || (c<Rhs.c);
    }
}
struct MyType
{
INTA、b、c;
bool操作符改为执行以下操作:

return std::tie(a, b, c) < std::tie(Rhs.a, Rhs.b, Rhs.c);
返回标准::tie(a,b,c)
您需要包含以下内容:

return std::tie(a, b, c) < std::tie(Rhs.a, Rhs.b, Rhs.c);
返回标准::tie(a,b,c)
您需要包含此表达式

(a<Rhs.a) || (b<Rhs.b) || (c<Rhs.c)
这是一个漫长的写作过程,我建议您使用它,因为它的可读性要高得多。

此表达式

(a<Rhs.a) || (b<Rhs.b) || (c<Rhs.c)

这是一个漫长的写作过程,我建议您使用它,因为它的可读性要高得多。

问题是,如果您引用两个
MyType
,比如说
M1={1,1,2}
M2={1,2,1}
您遇到的不幸情况是
M1
M2

为了解决此问题,您需要分配
a
b
c
一些重要性/顺序:

struct MyType
{
    int a, b, c;
    bool operator<(const MyType& Rhs) const
    {
       if (a < Rhs.a) return true;
       if (a > Rhs.a) return false;
       if (b < Rhs.b) return true;
       if (b > Rhs.b) return false;
       return c < Rhs.c;
    }
}
struct MyType
{
INTA、b、c;
bool运算符Rhs.a)返回false;
如果(bRhs.b)返回false;
返回c
(这是在dasblinkenlight的答案中编写表达式的一种不太理想的方法,但可能更容易理解)


但是一旦你理解了为什么需要这个,你应该切换到一个元组,这真的是一个样板代码。

问题是,如果你举两个
MyType
,比如说
M1={1,1,2}
M2={1,2,1}
您遇到的不幸情况是
M1
M2

为了解决此问题,您需要分配
a
b
c
一些重要性/顺序:

struct MyType
{
    int a, b, c;
    bool operator<(const MyType& Rhs) const
    {
       if (a < Rhs.a) return true;
       if (a > Rhs.a) return false;
       if (b < Rhs.b) return true;
       if (b > Rhs.b) return false;
       return c < Rhs.c;
    }
}
struct MyType
{
INTA、b、c;
bool运算符Rhs.a)返回false;
如果(bRhs.b)返回false;
返回c
(这是在dasblinkenlight的答案中编写表达式的一种不太理想的方法,但可能更容易理解)



但一旦您理解了为什么需要它,您就应该切换到一个
元组
,这实际上是样板代码。

如果您需要带有该类型键的映射,而不需要比较器,您可能需要使用boost::unordered_map并使用boost::hash_combine为您的类型定义哈希器

如果您需要具有该类型键的映射而不需要比较器,您可能需要使用boost::unordered_map并使用boost::hash_combine为您的类型定义哈希器

您的顺序不是严格的弱顺序。您不能在编写时将此类用作
std::map
的键。@KerrekSB什么是严格弱顺序?您可以:-)或在本网站上搜索数百个副本。您的顺序不是严格弱顺序。你不能像写的那样使用这个类作为
std::map
的键。@KerrekSB什么是严格弱序?你可以:-)或在这个网站上搜索数百个重复项。我不想使用元组。@Kerrek:请解释一下,这样OP就可以理解为什么它会工作。+1我想你会解释这个问题你的评论中也有“严格的弱顺序”的东西。@dasblinkenlight:这个主题的副本已经太多了。OP被邀请搜索该网站,寻找更好的人所做的更深入的解释。@Neil:无论如何,还是这样做吧。代码只使用引用,所以基本上没有成本。除非你喜欢这样的新闻标题孩子发明了轮子。科学家们感到困惑。“我宁愿不使用元组。@Kerrek:请解释一下,这样OP就能理解为什么它会起作用。+1我想你会解释“严格弱序”“你的评论中也有同样的东西。@dasblinkenlight:这个主题的副本已经太多了。”。OP被邀请在网站上搜索更好的人所做的更深入的解释。@Neil:不管怎样,还是去做吧。代码只使用引用,因此基本上没有成本。除非你喜欢新闻标题,比如“儿童改造轮子。科学家们困惑不解”。我必须使用的boost版本(1.33.1)似乎不支持这一点,所以我必须长期实施它。ThanksIt似乎我必须使用的boost版本(1.33.1)不支持这一点,所以我必须长期实现它。谢谢