C++ map

一、什么是 map

map 是 C++ 标准库中的关联式容器,用于存储 键值对(Key-Value) ,底层基于 红黑树 实现。其核心特性包括:

  • 键唯一性:每个键(Key)在容器中唯一,不可重复。

  • 自动排序:键值对按键的升序排列。

  • 高效查找 :插入、删除、查找的时间复杂度为 O(logN)

    cpp 复制代码
    #include <map>
    std::map<std::string, int> ageMap;
    ageMap["Alice"] = 25;  
    ageMap["Bob"] = 30;

    二、基本操作与示例

    1. 插入元素

  • insert:支持插入单个元素或范围。

  • 直接赋

    cpp 复制代码
    std::map<int, std::string> m;
    m.insert({1, "Apple"});      // 插入单个元素
    m.insert({{2, "Banana"}, {3, "Cherry"}});  // 插入多个元素
    m[4] = "Date";               // 使用下标插入

    :通过 [] 操作符直接赋值(若键不存在则自动创建)。

2. 查找元素

  • find :返回指向键的迭代器,若未找到则返回 end()

  • count :判断键是否存在(返回 0 或 1)。

    cpp 复制代码
    auto it = m.find(2);
    if (it != m.end()) {
        std::cout << it->second;  // 输出 "Banana"
    }

    3. 删除元素

  • erase:支持按键删除或按迭代器删除

cpp 复制代码
m.erase(2);           // 删除键为 2 的元素
m.erase(it);          // 删除迭代器指向的元素

三、进阶用法

1. 自定义键类型

默认使用 less<Key> 进行键比较,若需自定义排序规则,可通过仿函数或 operator< 实现。

cpp 复制代码
struct Person {
    std::string name;
    int age;
    bool operator<(const Person& p) const {
        return age < p.age;  // 按年龄排序
    }
};
std::map<Person, std::string> customMap;

2. 高效插入(C++17+)

  • try_emplace :避免不必要的临时对象构造。

    cpp 复制代码
    std::map<std::string, std::string> m;
    m.try_emplace("key", "value");  // 类似 insert,但更高效

    3. 内存优化技巧

  • 预分配策略:对于有序数据,提前排序后批量插入可减少红黑树旋转开销。

  • 节点转移 :使用 extract() 在容器间转移节点。

cpp 复制代码
auto node = m.extract("key");  // 提取节点
node.key() = "new_key";        // 修改键(需保证新键不冲突)
m.insert(std::move(node));     // 插入回容器

常见问题

  1. 键不可修改:键的值在插入后不可更改(否则破坏红黑树结构)。
  2. 避免重复键 :插入重复键时,insert 会失败,但 [] 会覆盖旧值。
  3. 并发安全 :多线程环境下需自行加锁(map 非线程安全)。
相关推荐
此生决int2 分钟前
算法从入门到精通——前缀和
c++·算法·蓝桥杯
凯瑟琳.奥古斯特7 分钟前
传输层核心功能解析
开发语言·网络·职场和发展
Fuyo_111922 分钟前
C++中的活字印刷术——模板·初阶
开发语言·c++·笔记
小白|23 分钟前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
在角落发呆23 分钟前
跨越网络鸿沟:传统文件传输与现代内网穿透的奇妙交响
开发语言·php
王老师青少年编程24 分钟前
2026年全国青少年信息素养大赛“算法应用主题赛”(初赛)【C++考点大纲】(全场景、组别):文末附备考秘籍!
c++·全国青少年信息素养大赛·初赛·2026年·算法应用主题赛·考点大纲
Season45027 分钟前
C++之模板元编程(前置知识 constexpr)
开发语言·c++
AI玫瑰助手29 分钟前
Python运算符:比较运算符(等于不等等于大于小于)与返回值
android·开发语言·python
咩咦1 小时前
C++学习笔记22:前置后置 ++/-- 和日期减日期
c++·学习笔记·运算符重载·日期类·前置++·后置++·日期减日期
计算机安禾1 小时前
【c++面向对象编程】第40篇:单例模式(Singleton)的多种C++实现
开发语言·c++·单例模式