C++ 如何比较结构

C++ 如何比较结构,c++,C++,我很难正确设置比较。 下面是我的问题的一个例子,我的代码错误地假定{1,2}={2,1}: #包括 #包括 使用名称空间std; 结构myStruct{ INTA; int b; bool operatora&&rhs.bb; } }; int main(){ std::map mymap; myStruct m1={1,2}; myStruct m2={2,1}; mymap.insert(make_对(m1,3)); std::map::迭代器it1=mymap.find(m1); std:

我很难正确设置比较。 下面是我的问题的一个例子,我的代码错误地假定{1,2}={2,1}:

#包括
#包括
使用名称空间std;
结构myStruct{
INTA;
int b;
bool operatora&&rhs.bb;
}
};
int main(){
std::map mymap;
myStruct m1={1,2};
myStruct m2={2,1};
mymap.insert(make_对(m1,3));
std::map::迭代器it1=mymap.find(m1);
std::map::迭代器it2=mymap.find(m2);
不能第二次;
//这里是it1->second=it2->second=3,尽管我希望it2等于map.end()。
}
我可以用| |代替&,但我也不确定这是否正确。我只想让操作符<以这样一种方式实现,即我能够在地图中找到对象,而不会出现任何错误,就像我链接到的代码中的情况一样


谢谢。

是的,这个操作符实现没有多大意义。我建议:

  bool operator<(const myStruct& rhs) const {
      return rhs.a < this->a || (rhs.a == this->a && rhs.b < this->b);
  }
bool operatora | |(rhs.a==this->a&&rhs.bb);
}

bool操作符您曾问过如何将其归纳为四个int成员,以下是我将如何构造这样的代码以获得最大的清晰度

bool operator<(const myStruct& 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;
  if (c < rhs.c)
    return true;
  if (c > rhs.c)
    return false;
  if (d < rhs.d)
    return true;
  if (d > rhs.d)
    return false;
  return false;
}
bool运算符(rhs.a)
返回false;
如果(brhs.b)
返回false;
如果(crhs.c)
返回false;
如果(d右舵)
返回false;
返回false;
}

您可以根据需要轻松地为任意多的数据成员扩展此类代码。

问题在于,您的运算符没有定义。仔细想想你的
{1,2}
{2,1}
的例子在操作符中的表现。假设
X={1,2}
,和
Y={2,1}

X Y 所以,如果X不小于Y,Y不小于X,剩下什么?他们是平等的

您需要选择结构的一个成员,
a
b
作为主要比较。如果主比较结果相等,则只检查次比较。就像当你做某事的时候。首先,你检查第一个字母,只有当它们相等时,你才能进入下一个字母。汉斯·帕桑(Hans Passant)提供了一个例子

这里有一个更严重的问题示例供操作员参考。我上面给出的一个并不一定是坏的,因为您可能希望
{1,2}
被认为等于
{2,1}
。基本问题是用这样的一组值来进行的:考虑<代码> x= {1,1,1},y= {1,2},z={2,2} < /代码>


对于运算符,X肯定小于Z,因为1小于2。但是X等于Y,Y等于Z。为了遵守严格的弱序,如果X=Y,Y=Z,那么X应该等于Z。但这里不是这样。

问题是你需要知道你的结构代表什么。否则,定义<运算符将变得任意。其他人不会给你一个合适的答案。举个例子,当您的结构表示二维中某点的cartisian坐标时。在这种情况下,您可以定义一个有意义的排序运算符,例如与结构原点的距离

i、 距离d1=this->a*this->a+this->b*this->b 距离d2=右侧a*右侧a+右侧b*右侧b 如果(d1返回false

最简单的解决方案是使用
std::tie
来比较元组

return std::tie(rhs.a, rhs.b) < std::tie(a, b);
返回标准::tie(rhs.a,rhs.b)

这将非常快速、简单地推广到更多的数据成员。

我更喜欢通过比较元素的相等性来编写这篇文章,直到找到两个不同的元素:

bool operator<(const myStruct& rhs) const {
    if (a != rhs.a)
        return a < rhs.a;
    if (b != rhs.b)
        return b < rhs.b;
    return false; // this and rhs are equal.
}

bool运算符该参数之所以称为rhs,是因为。。。右手边。但您目前测试的是rhsa>rhs.a
替换为
rhs.a
只需要
操作员就可以了。那么,这个答案有什么问题?
bool operator<(const myStruct& 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;
  if (c < rhs.c)
    return true;
  if (c > rhs.c)
    return false;
  if (d < rhs.d)
    return true;
  if (d > rhs.d)
    return false;
  return false;
}
return std::tie(rhs.a, rhs.b) < std::tie(a, b);
bool operator<(const myStruct& rhs) const {
    if (a != rhs.a)
        return a < rhs.a;
    if (b != rhs.b)
        return b < rhs.b;
    return false; // this and rhs are equal.
}