gpt4 book ai didi

c++ - 如何解决比较结构作为键映射 C++

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:42 24 4
gpt4 key购买 nike

没有主题解决我在 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);
}
}

当我在 map 中尝试现有项目时,如何解决比较这些结构 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向您的结构元素介绍字典顺序。

你可以通过层叠 < 比较来做同样的事情,但是这样代码会变得更长并且更容易出错:

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;
}
//...
};

关于c++ - 如何解决比较结构作为键映射 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47723533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com