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
相关产品推荐
相关产品推荐

