如何求解将结构作为关键映射C 进行比较
How to solve comparing structs as key map c++
无主题解决了我将结构作为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::set
和std::map
的比较器应作为<
,而不是==
。二进制搜索树不仅需要知道对象是否相等。它需要给他们一个订单,因为数据结构已排序。超载对象的<
操作员。
如果!comp(a, b) && !comp(b, a)
,则将对象视为平等。(来源)
如果您过载<
,则无需明确地将比较器提供给容器类型,因为默认值为比较器是std::less
,它包装了<
操作员。
相关文章:
- 智能指针作为无序映射键,并通过引用进行比较
- 比较两个大小不等的映射c++
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 定义具有非标准签名的自定义映射比较器
- std::映射服装比较函数和函数/lambda错误
- 如何为映射和priority_queue编写比较器,其中元素是二维数组
- 如何为C++映射创建自己的字符串比较对象
- 使用更大的比较器初始化映射
- STL映射比较器能否以某种方式获取指向映射本身的指针?
- 如何通过键和值以及在C 中的结果映射中比较两个地图?我们有任何STL API吗?
- 使用自定义比较器C++映射,不插入所有元素
- C++ priority_queue使用带有 lambda 比较器错误的映射
- C++ STL 比较映射找不到(运算符==)
- C++:对象键的多映射自定义比较器
- c++中一对对象的映射比较器
- 成员功能作为映射比较器
- 映射比较构造函数参数
- std::映射比较函数和NULL
- C++映射比较
- 映射比较操作符重载