如何求解将结构作为关键映射C 进行比较

How to solve comparing structs as key map c++

本文关键字:映射 比较 何求解 结构      更新时间:2023-10-16

无主题解决了我将结构作为C 中的键图进行比较的问题。

构造代码如下:

struct XYZ{
  int x, y, z;
}
struct XYZComp{
  bool operator()(const XYZ& l, const XYZ& r)
  {
    return ((l.x==r.x)&&(l.y==r.y)&&(l.z==r.z));
  }
}

主要看起来像

int main()
{
  map<XYZ, int, XYZComp> m;
  m.insert(std::make_pair<XYZ,int>({1,2,3}, 1)); //ok
  map<XYZ, int, XYZComp>::iterator it = m.find({1,0,3});
  if(it!=m.end())
  {
    std::cout<<"Key exists in map"; 
  }
  else
  {
    m.insert(std::make_pair<XYZ,int>({1,0,3}, 1));
    //never come here 
    //compiler thinks key already exists in map
  }
return 0;
} 

我只是在没有xyzcomparer的情况下尝试过,但仍然不起作用。

struct XYZ{
  int x,y,z;
  bool operator==(const XYZ& xyz)
  {
    return (x=xyz.x) && (y=xyz.y) && (z=xyz.z);
  }
  bool operator<(const XYZ& xyz)
  {
    return (x>xyz.x) && (y>xyz.y) && (z>xyz.z);
  }
}

当我尝试在地图中尝试现有项目时,如何解决这些结构xyz。

编辑:编译器认为至少一个数字正确时结构相同。

std::map使用<订购项目。因此,您的struct XYZComp需要提供用户定义的operator <

一个非常简单的解决方案是使用std :: tie:

#include <tuple>
//..
struct XYZComp
{
    int x,y,z;
    bool operator < (const XYZComp& xyz)
    {
       return std::tie(x, y, z) < std::tie(xyz.x, xyz.y, xyz.z); 
    }
    //...
};

std::tie向您的结构元素引入词典订购。

您可以通过级联&lt;可以做同样的事情;比较,但随后代码变得更长,更容易犯错:

struct XYZComp
{
    int x,y,z;
    bool operator < (const XYZComp& xyz)
    {
       if ( x < xyz.x )
         return true;
       if ( x == xyz.x &&  y < xyz.y )
         return true;
       if ( x == xyz.x && y == xyz.y )
           return z < xyz.z;
       return false;
   }
    //...
};

std::setstd::map的比较器应作为<,而不是==。二进制搜索树不仅需要知道对象是否相等。它需要给他们一个订单,因为数据结构已排序。超载对象的<操作员。

如果!comp(a, b) && !comp(b, a),则将对象视为平等。(来源)

如果您过载<,则无需明确地将比较器提供给容器类型,因为默认值为比较器是std::less,它包装了<操作员。