标准::映射 标准::集合包含重复的键

Std::map std::set contain duplicate keys

本文关键字:标准 集合 映射 包含重      更新时间:2023-10-16

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

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

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