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 非线程安全)。
相关推荐
Tipriest_7 分钟前
旋转矩阵,齐次变换矩阵,欧拉角,四元数等相互转换的常用代码C++ Python
c++·python·矩阵
毕设源码-钟学长9 分钟前
【开题答辩全过程】以 基于PHP的家常菜谱教程网站为例,包含答辩的问题和答案
开发语言·php
消失的旧时光-194314 分钟前
用 C 实现一个简化版 MessageQueue
c语言·开发语言
小鹿学程序14 分钟前
jdk配置完之后java -version还是默认的jdk版本如何更改
java·开发语言·python
至善迎风15 分钟前
Bun:下一代 JavaScript 运行时与工具链
开发语言·javascript·ecmascript·bun
程序员-King.18 分钟前
【Qt开源项目】— ModbusScope-day 5
开发语言·qt
hz_zhangrl19 分钟前
CCF-GESP 等级考试 2025年9月认证C++六级真题解析
c++·算法·青少年编程·程序设计·gesp·2025年9月gesp·gesp c++六级
老秦包你会24 分钟前
QT第五课------QT系统相关------线程
开发语言·qt
lkbhua莱克瓦2429 分钟前
IO练习——网络爬虫(爬取数据)
java·开发语言·爬虫·io流练习·java练习
net3m3336 分钟前
雅特力单片机用串口USART_INT_TDE中断比用USART_INT_TRAC的 发送效率要高
java·开发语言·算法