自定义itemIndex结构体作为std::map键查询返回首个插入值问题排查
故障根因
std::map 底层基于红黑树实现,判断两个键是否等价的逻辑为:对于键a和键b,若 !(a < b) && !(b < a) 成立,则判定a和b是同一个键,全程不会使用你重载的operator==做判断。
你实现的operator<不符合严格弱序要求:当两个itemIndex的col值不相等时直接返回false,会导致所有col不同的结构体实例在map的判定逻辑里都被视为等价。
对应你遇到的问题场景示例:
- 已插入的键为
A{row:0, col:1} - 你要查询的键为
B{row:5, col:0}- 判定
A < B:两者col不等,返回false - 判定
B < A:两者col不等,返回false - 最终map认为A和B是同一个键,所以
find返回匹配成功。
- 判定
修复方案
修改operator<的实现,先比较列号,列号相等再比较行号即可:
struct itemIndex { int row; int col; bool operator< (const itemIndex &i) const { if (this->col != i.col) return this->col < i.col; return this->row < i.row; } bool operator== (const itemIndex &i) const { return (this->row == i.row && this->col == i.col); } };
额外优化建议:你代码里先调用find判断存在后又用[]取值是冗余操作,[]在键不存在时会自动插入默认构造的键值对,更安全的写法是直接保存find返回的迭代器,判断有效后直接取迭代器的value。
内容的提问来源于stack exchange,提问作者TheSpiceMustFlow
相关产品推荐
相关产品推荐

