【发布时间】:2016-02-29 10:31:24
【问题描述】:
我有一个问题,虽然我理解,但这是一个愚蠢的问题,但我无法自己找到解决方案。
所以,我正在尝试积累一个具有我所拥有的结构的唯一值的容器。
struct Symbol {
D2D1_RECT_F bbox;
wchar_t data;
fz_font_s* font;
float color[4];
};
我正在尝试使用std::map 和std::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> 中插入值。
不幸的是,结果令人沮丧,因为我得到的与对象相差甚远,仅包含唯一键。大多数符号都有重复项。
所以我真的明白,我错过了什么?
【问题讨论】:
-
您是否检查过
SymbolCmp(a,b)和SymbolCmp(b,a)的返回值与两个应该比较相等的Symbols a 和b? -
没仔细看,但在我看来
SymbolCmp不满足strict-weak ordering。提示:如果relative始终为true,还会发生这种情况吗? -
需要严格-弱排序。你能用你写的所有代码保证吗?只是使用浮点本身来确定顺序是可疑的。
-
@MohitJain 好吧,从我所做的测试来看,我对订单非常肯定。
-
比较对象的方式对我来说似乎太复杂了。您应该考虑它所描绘的内容;也许有更简单的方法。错误来源之一可能是
bbox:它是否已标准化?您是否尝试调试两个“相等”的对象?