gpt4 book ai didi

c++ - Std::map\std::set 包含重复键

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:29 24 4
gpt4 key购买 nike

我有一个问题,虽然我明白,但这是一个愚蠢的问题,但我没能自己找到解决方案。

所以,我正在尝试积累一个具有我所拥有的结构的唯一值的容器。

struct Symbol {
D2D1_RECT_F bbox;
wchar_t data;
fz_font_s* font;
float color[4];
};

我正在做的是尝试使用 std::mapstd::set .请注意,我需要提供一个谓词以便为容器提供一种确定顺序的方法。我拥有的是:

struct SymbolCmp {
bool operator() (const Symbol& lhs, const Symbol& rhs) const
{
auto errorHandler = (lhs.bbox.top == rhs.bbox.top) ? (lhs.bbox.left < rhs.bbox.left) : lhs.bbox.top < rhs.bbox.top;

if (lhs.data == rhs.data &&
lhs.font != rhs.font) {
return errorHandler;
}

float lArea = (lhs.bbox.bottom - lhs.bbox.top) *
(lhs.bbox.right - lhs.bbox.left);
float rArea = (rhs.bbox.bottom - rhs.bbox.top) *
(rhs.bbox.right - rhs.bbox.left);

auto relative = (lArea / rArea < 0.95f ||
lArea / rArea > 1.05f);

return (lhs.data == rhs.data) ? relative && errorHandler : (lhs.data < rhs.data);
}
};

然后我尝试在 std::set<Symbol, SymbolCmp> 中插入值和 std::map<Symbol, byte, SymbolCmp> .

可悲的是,结果令人沮丧,因为我得到的与对象相去甚远,仅包含唯一键。大多数符号都有重复项。

所以我真的明白,我错过了什么?

最佳答案

您的谓词不能确保严格弱排序。以下应该有效:

struct SymbolCmp {
bool operator() (const Symbol& lhs, const Symbol& rhs) const
{
if(lhs.data == rhs.data) {
return (lhs.bbox.top == rhs.bbox.top) ? (lhs.bbox.left < rhs.bbox.left) : lhs.bbox.top < rhs.bbox.top;
} else {
return lhs.data < rhs.data;
}
}
};

如果要在逻辑中使用fontcolor 和dimension,请确保遵循strict-weak 排序约束。

关于c++ - Std::map\std::set 包含重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35697290/

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