标准::映射 标准::集合包含重复的键
Std::map std::set contain duplicate keys
我有一个问题,虽然我理解,这是一个愚蠢的问题,但我自己未能找到解决方案。
因此,我正在尝试积累一个具有我拥有的结构的唯一值的容器。
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>
中插入值。
可悲的是,结果令人沮丧,因为我得到的离对象很远,只包含唯一键。大多数符号都有重复项。
所以我真的明白,我错过了什么?
谓词不能确保严格-弱排序。以下应该有效:
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;
}
}
};
如果要在逻辑中使用 font
、 color
和维度,请确保遵循严格-弱排序约束。
相关文章:
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- 如何将ampl中的集合表示为c++中的向量
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 检查值是否在集合p1和p2中,但不在p3中
- 带过滤器的现代迭代c++集合
- 如何将结构插入到集合中并打印集合的成员
- 集合上的输出迭代器:assign和increment迭代器
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 实现一个在集合上迭代的模板函数
- 有没有办法为集合指定不同的唯一性和排序标准
- C++ 集合有序迭代 - 是迭代集合的结果,按标准排序
- 标准::映射 标准::集合包含重复的键
- 移动语义、标准集合和构造时间地址
- c++标准库是否有按插入顺序排序的集合
- 输出或遍历集合的所有对组合的标准算法