You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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}
    1. 判定A < B:两者col不等,返回false
    2. 判定B < A:两者col不等,返回false
    3. 最终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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:39:03