当前位置: 首页 > news >正文

C++std::map

1. 概述​​

  • ​​定义​​:std::map 是C++标准模板库(STL)中的关联容器,以键值对(key-value pairs)形式存储元素,支持快速查找和有序访问。
    ​​- 头文件​​:#include
  • ​​底层实现​​:通常基于红黑树(平衡二叉搜索树),保证元素有序性和操作高效性。

​​2. 核心特性​​

​​3. 基本用法​​

​​声明与初始化​​
std::map<KeyType, ValueType> myMap;  // 默认升序
std::map<KeyType, ValueType, Compare> customMap;  // 自定义排序规则
​​插入元素​​
// 方法1:通过下标操作符(若键存在,覆盖值)
myMap["Alice"] = 30;// 方法2:insert() 插入键值对
myMap.insert(std::pair<std::string, int>("Bob", 25));// 方法3:emplace() 直接构造元素(C++11起)
myMap.emplace("Charlie", 35);
​​访问元素​​
// 通过键访问(若键不存在,自动插入默认值)
int age = myMap["Alice"];// 安全访问:find() 检查键是否存在
auto it = myMap.find("David");
if (it != myMap.end()) {int age = it->second;  // 存在时访问值
}
​​遍历元素​​
// 使用迭代器
for (auto it = myMap.begin(); it != myMap.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;
}// 使用范围for循环(C++11起)
for (const auto& pair : myMap) {std::cout << pair.first << ": " << pair.second << std::endl;
}

​​### 4. 代码示例​​

#include <iostream>
#include <map>
#include <string>int main() {std::map<std::string, int> employees;// 插入元素employees["Alice"] = 30;employees.emplace("Bob", 25);employees.insert({"Charlie", 35});// 遍历打印for (const auto& emp : employees) {std::cout << emp.first << " is " << emp.second << " years old.\n";}return 0;
}

​​输出​​:

Alice is 30 years old.
Bob is 25 years old.
Charlie is 35 years old.

​​### 5. 进阶操作​​
​​

自定义排序规则​​
// 定义比较函数(此处实现降序)
struct CompareDesc {bool operator()(const std::string& a, const std::string& b) const {return a > b;}
};int main() {std::map<std::string, int, CompareDesc> myMap;myMap["Alice"] = 30;myMap["Bob"] = 25;// 输出顺序:Charlie → Bob → Alice
}

6. 注意事项​​

  1. ​​键的唯一性​​:若需允许重复键,使用std::multimap。
  2. ​​自动插入风险​​:operator[]会在键不存在时插入默认值,优先使用find()检查存在性。
  3. 自定义比较函数​​:需严格遵循严格弱序(strict weak ordering)规则。​​
  4. 性能权衡​​:虽然查找高效,但内存开销高于无序容器(如std::unordered_map)。​​

7. 总结​​

std::map 是处理有序键值对数据的理想选择,适用于需要按键排序和快速查找的场景。结合其特性与STL提供的丰富接口,可高效实现复杂数据管理需求。

相关文章:

  • 批量替换多个 Word 文档中的指定图片
  • Spark SQL核心解析:大数据时代的结构化处理利器
  • 奇怪的问题
  • 【大数据分析】Apache Doris高性能实时分析数据库:MPP架构下的多场景应用与优势分析以及部署应用
  • 第十四届蓝桥杯 2023 C/C++组 飞机降落
  • 外网如何连接内网中的mysql数据库服务器
  • 云原生--基础篇-2--云计算概述(云计算是云原生的基础,IaaS、PaaS和SaaS服务模型)
  • 微信小程序 == 倒计时验证码组件 (countdown-verify)
  • 【Linux】:HTTPS协议
  • 阿里V2 点击验证码/新版 2.0-2.1-3.1-3.2 动态Fell
  • 【上位机——MFC】运行时类信息机制
  • C++ GPU并行计算开发实战:利用CUDA/OpenCL加速粒子系统与流体模拟
  • git比较不同分支的不同提交文件差异
  • Linux-网络基础
  • mindspeed-rl使用注意事项
  • 【ESP32】【微信小程序】MQTT物联网智能家居案例
  • Nginx下搭建rtmp流媒体服务 并使用HLS或者OBS测试
  • 相机标定(输出相机内参和畸变参数)
  • 前端实现数据导出成excel
  • RIP动态路由(三层交换机+单臂路由)
  • 协信远创620亿元债务重整计划获法院批准:冯仑入局,部分核心资产已提前转让
  • 陈杨梅:刷到“棉花糖爸爸”寻女视频,隐约觉得自己就是爸爸要找的孩子
  • 特写|为何这么多人喜欢上海半马,答案藏在他们的笑容里
  • 寻女19年的“棉花糖爸爸”明将办团圆宴,大女儿:妹妹是片区销售主管
  • 3月赴美外国游客数量加速下滑
  • 义乌女老板对CNN霸气喊话:美国要货就给,不要就分给其他客户