MST

星途 面试题库

面试题:C++ 中如何安全修改 map 容器的键值

在 C++ STL 的 map 容器中,键通常是不可变的,但有时确实需要修改键值。请描述一种安全修改 map 容器键值的方法,并编写一段代码示例实现将 map 中某个特定旧键值修改为新键值,同时保持原有值的关联,且要处理可能出现的异常情况。
28.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 方法描述

    • 由于map的键不可直接修改,一种安全的方法是先根据旧键找到对应的值,然后删除旧键值对,再插入新键值对,保持值的关联。
    • 在这个过程中,需要处理可能出现的异常,例如在删除或插入操作失败时进行适当处理。
  2. 代码示例

#include <iostream>
#include <map>
#include <string>

void modifyMapKey(std::map<int, std::string>& myMap, int oldKey, int newKey) {
    try {
        // 查找旧键
        auto it = myMap.find(oldKey);
        if (it != myMap.end()) {
            std::string value = it->second;
            // 删除旧键值对
            myMap.erase(it);
            // 插入新键值对
            myMap.insert({newKey, value});
        } else {
            std::cerr << "旧键未找到" << std::endl;
        }
    } catch (const std::exception& e) {
        std::cerr << "操作出现异常: " << e.what() << std::endl;
    }
}

int main() {
    std::map<int, std::string> myMap = {{1, "apple"}, {2, "banana"}};
    modifyMapKey(myMap, 1, 3);
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    return 0;
}

在上述代码中:

  • modifyMapKey函数接受一个map、旧键和新键作为参数。
  • 首先查找旧键,如果找到则获取对应的值,删除旧键值对,然后插入新键值对。
  • 如果旧键未找到,输出提示信息。
  • try - catch块中捕获可能出现的异常并输出错误信息。
  • main函数中创建一个map并调用modifyMapKey函数进行键值修改,最后输出修改后的map内容。