C++ map详解
C++ map
map 是 C++ 标准库中的关联容器,存储 键值对(key-value),并按照键自动排序
一、基本特点
1.头文件:#include
二、常用操作
1. 声明和初始化
#include<map>#include<string>usingnamespacestd;// 空 mapmap<int,string>m1;// 初始化列表map<int,string>m2={{1,"apple"},{2,"banana"},{3,"cherry"}};// 拷贝构造map<int,string>m3(m2);2. 插入元素
map<int,string>m;// 方法1:使用 insertm.insert({1,"apple"});m.insert(pair<int,string>(2,"banana"));m.insert(make_pair(3,"cherry"));// 方法2:使用 [] 运算符(如果键不存在则创建)m[4]="date";// 插入键4,值"date"m[1]="avocado";// 键1已存在,更新值// 方法3:insert_or_assignm.insert_or_assign(5,"elderberry");3. 访问元素
map<int,string>m={{1,"apple"},{2,"banana"},{3,"cherry"}};// 使用 [](键不存在时会创建!危险)string s1=m[1];// "apple"string s2=m[100];// 错误!会插入键100,值为空字符串// 使用 at()(推荐,键不存在时抛异常)string s3=m.at(2);// "banana"// string s4 = m.at(100); // 抛出 out_of_range 异常// 使用 find(最安全)autoit=m.find(3);if(it!=m.end()){string s=it->second;// "cherry"}4. 删除元素
map<int,string>m={{1,"a"},{2,"b"},{3,"c"},{4,"d"}};// 按键删除m.erase(2);// 删除键2// 按迭代器删除autoit=m.find(3);if(it!=m.end()){m.erase(it);}// 删除范围autofirst=m.find(1);autolast=m.find(4);m.erase(first,last);// 删除 1 到 4 之前的元素5. 查找元素
map<int,string>m={{1,"apple"},{2,"banana"},{3,"cherry"}};// find:返回迭代器,找不到返回 end()autoit=m.find(2);if(it!=m.end()){cout<<it->first<<" -> "<<it->second<<endl;}// count:返回键存在的数量(0 或 1)if(m.count(2)){cout<<"键2存在"<<endl;}// lower_bound / upper_bound(用于范围查询)autolow=m.lower_bound(2);// 第一个 >= 2 的位置autoup=m.upper_bound(2);// 第一个 > 2 的位置6. 遍历
map<int,string>m={{1,"a"},{2,"b"},{3,"c"}};// 范围 for 循环for(constauto&p:m){cout<<p.first<<" -> "<<p.second<<endl;}// 迭代器for(autoit=m.begin();it!=m.end();++it){cout<<it->first<<" -> "<<it->second<<endl;}三、完整示例
#include<iostream>#include<map>#include<string>usingnamespacestd;intmain(){map<string,int>scores;// 插入scores["Alice"]=95;scores["Bob"]=87;scores.insert({"Charlie",92});// 修改scores["Alice"]=98;// 查找string name="Bob";if(scores.find(name)!=scores.end()){cout<<name<<" 的分数是 "<<scores[name]<<endl;}// 遍历(自动按名字排序)for(constauto&[name,score]:scores){cout<<name<<" -> "<<score<<endl;}// 删除scores.erase("Charlie");cout<<"总人数: "<<scores.size()<<endl;return0;}