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

C++类内部unordered_map添加数据功能实现异常问题咨询

C++ Citydata类add_data函数问题排查

1 现有代码的语法错误

你贴出的头文件首先存在两处明显语法问题,会直接导致编译失败:

  • 容器模板参数错误:私有成员info_map的unordered_map第一个模板参数为键的类型,你错误填写了参数名id,正确写法为std::unordered_map<std::string, City_details> info_map;,如果代码未声明using namespace std;,所有标准库类型都需要加std::前缀。
  • 语法结构不完整:add_data函数声明末尾缺少分号,Citydata类定义末尾缺少闭合的};。

2 add_data逻辑的问题排查

你当前贴出的add_data核心逻辑本身没有设计层面的缺陷:先判断id是否存在,不存在时构造City_details对象存入map的逻辑是通顺的。你遇到的重复空条目、存储值为空的问题,大概率来自以下场景:

  • 其他位置提前调用了info_map[id]:unordered_map的[]运算符在对应key不存在时,会自动插入一条默认构造的value(string为空、int为0的City_details对象),会导致你调用add_data时find操作已经匹配到这个自动插入的空条目,直接返回false。
  • 类的拷贝/移动逻辑错误:如果Citydata类自定义了拷贝构造、拷贝赋值、移动构造函数,实现有误导致成员变量浅拷贝或未正确拷贝info_map,会出现存储值丢失的情况。
  • 调用传参错误:检查调用add_data的上层逻辑,确认传入的name、taxes参数本身不是空值/默认值。

3 优化建议

可以优化add_data的实现,避免冗余查找,同时彻底规避自动插入空条目的问题:

bool Citydata::add_data(std::string id, std::string name, int taxes) {
    return info_map.insert(
        std::make_pair(
            std::move(id),
            City_details{std::move(name), taxes}
        )
    ).second;
}

该写法直接通过insert的返回值判断是否插入成功,比先find再插入少一次哈希查找,同时不会触发[]运算符的默认插入逻辑,性能和安全性更高。

内容的提问来源于stack exchange,提问作者JustAnotherDoomer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:06:03