使用 Structs 作为映射中的键,忽略 == 运算符,误报
Using Structs as keys in maps, ignoring == operators, false positive
我正在尝试将结构用作映射中的键,但尽管定义了 <
和 ==
运算符,但我得到了误报:
return models[mr];
即使新的 ImportSettings
有 reverse = true
而模型中的那个有 `reverse = false.
也会返回
Visual studio 调试器还显示 ==
的运算符调用甚至没有被调用。我在这里误解了什么?
struct HE2_ImportSettings
{
bool reverseWindingOrder = false;
bool operator==(const HE2_ImportSettings& other)const
{
return reverseWindingOrder == other.reverseWindingOrder;
}
};
struct ModelReference
{
std::string filepath = "";
HE2_ImportSettings importSettings = {};
bool ModelReference::operator == (const ModelReference& other) const
{
return filepath == other.filepath && importSettings == other.importSettings;
}
bool ModelReference::operator< (const ModelReference& other) const
{
return filepath < other.filepath;
}
};
ModelReference mr = { filename, importSettings };
bool exists = models.count(mr);
if (exists)
{
//This is returning even when the new importsettings has reverse = true and the one in models has reverse = false
return models[mr];
}
std::map
使用等价的概念。当
时两个元素是等价的
!(a < b) && !(b < a)
换句话说,地图从不使用 ==
来查看两个元素是否相同。在您的地图中,当两个元素具有相同的 filepath
时,它们被认为是等价的。如果您还想将 importSettings
考虑到地图中的排序,您还需要在 operator<
.
中进行比较
我正在尝试将结构用作映射中的键,但尽管定义了 <
和 ==
运算符,但我得到了误报:
return models[mr];
即使新的 ImportSettings
有 reverse = true
而模型中的那个有 `reverse = false.
Visual studio 调试器还显示 ==
的运算符调用甚至没有被调用。我在这里误解了什么?
struct HE2_ImportSettings
{
bool reverseWindingOrder = false;
bool operator==(const HE2_ImportSettings& other)const
{
return reverseWindingOrder == other.reverseWindingOrder;
}
};
struct ModelReference
{
std::string filepath = "";
HE2_ImportSettings importSettings = {};
bool ModelReference::operator == (const ModelReference& other) const
{
return filepath == other.filepath && importSettings == other.importSettings;
}
bool ModelReference::operator< (const ModelReference& other) const
{
return filepath < other.filepath;
}
};
ModelReference mr = { filename, importSettings };
bool exists = models.count(mr);
if (exists)
{
//This is returning even when the new importsettings has reverse = true and the one in models has reverse = false
return models[mr];
}
std::map
使用等价的概念。当
!(a < b) && !(b < a)
换句话说,地图从不使用 ==
来查看两个元素是否相同。在您的地图中,当两个元素具有相同的 filepath
时,它们被认为是等价的。如果您还想将 importSettings
考虑到地图中的排序,您还需要在 operator<
.