C++ map的使用

以下详细介绍 C++ std::map 的核心用法,结合基本操作、进阶技巧和典型场景,帮助你高效使用这一关联容器:


📦 一、基础操作

  1. 定义与初始化

    • 需包含头文件:#include <map>
    • 声明示例:
      std::map<int, std::string> studentScores;  // 键为学号(int),值为姓名(string)
  2. 插入元素

    • ​**insert 方法**​:
      studentScores.insert(std::make_pair(1001, "Alice"));
      studentScores.insert({1002, "Bob"});  // C++11 简化语法
    • ​**operator[] 方法**​(若键不存在则自动创建):
      studentScores[1003] = "Charlie";  // 直接赋值插入
  3. 访问元素

    • ​**operator[]**​:
      std::string name = studentScores[1001];  // 若键不存在,会创建默认值(空字符串)
    • ​**find 方法**​(安全访问):
      auto it = studentScores.find(1002);
      if (it != studentScores.end()) {
          std::cout << "Found: " << it->second;  // it->second 获取值
      }

⚙️ 二、进阶操作

  1. 删除元素

    • ​**erase 方法**​:
      studentScores.erase(1001);  // 按键删除
      studentScores.erase(it);    // 按迭代器删除
    • 安全删除建议​:遍历时需先收集待删键,再统一删除,避免迭代器失效。
  2. 遍历元素

    • 迭代器遍历​(按键升序):
      for (auto it = studentScores.begin(); it != studentScores.end(); ++it) {
          std::cout << it->first << ": " << it->second << std::endl;  // first为键,second为值
      }
    • 范围循环​(C++11):
      for (const auto& pair : studentScores) {
          std::cout << pair.first << ": " << pair.second << std::endl;
      }
  3. 检查键是否存在

    • 使用 findcount
      if (studentScores.find(1003) != studentScores.end()) { /* 存在 */ }
      if (studentScores.count(1003) > 0) { /* 存在(返回1或0)*/ }

🧩 三、特性与自定义

  1. 自动排序

    • map 基于红黑树实现,​按键升序排列​(默认 std::less<Key>)。
    • 示例:插入 {3, "C"}, {1, "A"}, {2, "B"},遍历输出顺序为 1:A, 2:B, 3:C
  2. 自定义排序规则

    • 通过函数对象定义降序:
      struct CompareDesc {
          bool operator()(int a, int b) const { return a > b; }
      };
      std::map<int, std::string, CompareDesc> descMap;  // 按键降序

🚀 四、典型应用场景

  1. 统计频率
    std::map<std::string, int> wordCount;
    for (const auto& word : words) {
        wordCount[word]++;  // 自动初始化未出现的键为0
    }
  2. 键值映射存储
    如存储学生 ID 到成绩的映射:
    std::map<int, double> scores = {{101, 95.5}, {102, 88.0}};
    double score = scores.at(101);  // at() 方法在键不存在时抛出异常(更安全)

⚠️ 注意事项

  • 键的唯一性​:重复插入同一键会覆盖旧值。
  • ​**operator[] 的风险**​:访问不存在的键会创建默认值,可能意外增加元素。建议用 find()count() 检查。
  • 性能​:插入、删除、查找操作时间复杂度为 ​O(log n)​,适合需有序键的场景。若无需排序,可用 std::unordered_map(哈希表实现,O(1) 操作)。

通过灵活应用上述方法,可高效管理键值对数据,满足各类有序映射需求。完整代码示例可参考来源文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值