【问题标题】:Std::map \ std::set contain duplicate keysStd::map \ std::set 包含重复键
【发布时间】:2016-02-29 10:31:24
【问题描述】:

我有一个问题,虽然我理解,但这是一个愚蠢的问题,但我无法自己找到解决方案。

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

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&lt;Symbol, SymbolCmp&gt;std::map&lt;Symbol, byte, SymbolCmp&gt; 中插入值。

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

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

【问题讨论】:

  • 您是否检查过SymbolCmp(a,b)SymbolCmp(b,a) 的返回值与两个应该比较相等的Symbols a 和b?
  • 没仔细看,但在我看来SymbolCmp 不满足strict-weak ordering。提示:如果relative 始终为true,还会发生这种情况吗?
  • 需要严格-弱排序。你能用你写的所有代码保证吗?只是使用浮点本身来确定顺序是可疑的。
  • @MohitJain 好吧,从我所做的测试来看,我对订单非常肯定。
  • 比较对象的方式对我来说似乎太复杂了。您应该考虑它所描绘的内容;也许有更简单的方法。错误来源之一可能是bbox:它是否已标准化?您是否尝试调试两个“相等”的对象?

标签: c++ std stdmap stdset


【解决方案1】:

您的谓词不能确保严格-弱排序。以下应该工作:

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 和维度,请确保遵循 strct-weak 排序约束。

【讨论】:

  • 您能否解释一下,我的谓词中的严格弱排序有什么问题?我的意思是,在什么情况下它会无法提供订单?
  • @AleksandrKurinnoi 如果有 3 个类 A、B 和 C 使得 A.font = B.font 并且区域几乎相同,则 A
猜你喜欢
  • 1970-01-01
  • 2014-03-15
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2014-04-15
  • 2017-07-28
  • 2011-06-16
相关资源
最近更新 更多