C++:是否存在插入/修改map键值对后返回迭代器的函数?
解决方案:Map插入/修改后返回迭代器的实现
你的核心需求是实现不存在则插入键值对,存在则修改对应值,同时返回指向该元素的迭代器(以便获取值的指针),以下是两种直接可行的方案:
方案1:使用C++17的insert_or_assign(推荐)
C++17引入的std::map::insert_or_assign完全匹配你的需求——自动处理插入/修改逻辑,同时返回指向目标元素的迭代器:
#include <map> using namespace std; std::map<int, int> a = {{1, 1}}; int* set_and_return_value() { // insert_or_assign:key存在则赋值,不存在则插入,返回包含迭代器的pair auto [it, is_inserted] = a.insert_or_assign(1, 2); return &(it->second); }
说明:
- 返回值中的
it是指向目标键值对的迭代器,无论元素是新插入还是已修改; is_inserted为布尔值,标记该元素是否是本次调用新插入的(不需要可以直接忽略);- 相比
operator[],insert_or_assign不会默认构造值类型(对自定义类型更友好,避免不必要的构造开销),写法也更清晰。
方案2:兼容C++17之前版本的手动实现
如果项目无法使用C++17,可以通过find+emplace的组合手动实现相同逻辑:
#include <map> using namespace std; std::map<int, int> a = {{1, 1}}; int* set_and_return_value() { auto it = a.find(1); if (it != a.end()) { // 键已存在,修改对应值 it->second = 2; } else { // 键不存在,插入新元素并获取迭代器 it = a.emplace(1, 2).first; } return &(it->second); }
说明:
- 先通过
find检查键是否存在,避免了operator[]的默认构造行为; - 插入时使用
emplace直接构造元素,效率更高。
两种方案都能完成插入/修改操作后,返回指向目标元素的迭代器,进而获取值的指针供后续逻辑使用。
内容的提问来源于stack exchange,提问作者nothingisme
相关产品推荐
相关产品推荐

