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 非线程安全)。
相关推荐
Lyndon-李大鹏8 小时前
QT-VS环境
开发语言·qt
微学AI9 小时前
内网穿透的应用-把飞牛NAS变成家庭录像中心:EasyNVR部署与远程回放实战
开发语言·php
峥嵘life9 小时前
Android WiFi连接过程 wpa_supplicant 日志分析
android·开发语言·php
BerryS3N9 小时前
深度解析:从零构建生产级大模型 RAG(检索增强生成)系统全栈指南
开发语言·python·ai
今儿敲了吗9 小时前
Python——函数基础
开发语言·笔记·python
CHANG_THE_WORLD9 小时前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
kels889910 小时前
单连接动态增减订阅:股票行情API后端降负载实战方案
开发语言·笔记·python·信息可视化·金融
一拳一个呆瓜10 小时前
【STL】iostream 编程:使用提取运算符
c++·stl
a44931536210 小时前
MacBook USB-C不充电故障诊断:从PD握手到主板供电链路
c语言·开发语言·macos·电脑
德福危险10 小时前
从目录枚举到bash破壳漏洞、从流量抓包到组权限提权:靶机练习之symfonos3
开发语言·bash