C++17中使用默认可构造类值更新map的最优方法
最优实现方式
你的核心问题是:当前代码中修改的是外部的MyClass实例,而非map内部存储的副本,导致map中的值未更新。要直接修改map内的对象属性,有两种高效且符合C++17规范的实现方式:
方式一:直接利用operator[]返回的引用操作
map::operator[]会返回对应键值对中值的左值引用——如果键已存在,返回现有值的引用;如果不存在,则默认构造一个新值并返回其引用。你可以直接通过这个引用调用类的方法修改属性:
void testing(){ map<string, MyClass> mapping; MyClass one; mapping["hh"] = one; // 将one的副本存入map cout << mapping["hh"].attribute << endl; // 输出1 mapping["hh"].update(10); // 直接操作map内的对象实例 cout << mapping["hh"].attribute << endl; // 输出10 }
这种方式代码简洁,适合确定键一定存在,或者允许键不存在时自动插入默认构造对象的场景。
方式二:用map::find安全查找并修改
如果需要避免自动插入不存在的键(防止意外创建无效键值对),可以使用map::find查找目标键:
- 查找成功时,迭代器指向目标键值对,通过
it->second获取值的引用; - 查找失败时,迭代器等于
map::end(),可以做异常处理或跳过操作。
示例代码:
void testing(){ map<string, MyClass> mapping; MyClass one; mapping["hh"] = one; cout << one.attribute << endl; // 输出1 one.update(10); cout << one.attribute << endl; // 输出10 // 查找目标键 auto it = mapping.find("hh"); if (it != mapping.end()) { it->second.update(20); // 修改map内的对象属性 cout << it->second.attribute << endl; // 输出20 } else { // 键不存在时的处理逻辑 cout << "Key not found!" << endl; } }
为什么原代码无法生效?
原代码中mapping["hh"] = one是将one的副本存入map,之后修改外部的one实例,只会改变这个独立对象的属性,和map内部存储的副本没有任何关联。只有直接操作map内部对象的引用,才能让修改生效。
内容的提问来源于stack exchange,提问作者温泽海
相关产品推荐
相关产品推荐

