STL——map、multimap


关联容器与map的介绍

所谓关联容器,是相对顺序容器而言,关联容器中的元素是按照关键字(KEY)l来保存和访问的(顺序容器是根据元素在容器中的位置来保存和访问的)。

关联容器中有两个最主要的类型:一个是map,另一个是set。map中的元素是键值对(key-value),其中键(key)用于索引关联的数值(value),set中只有key。

其中,在map,中键值对是以pair形式存储的,pair是标准库类型,定义在头文件utility中。pair保存两个数据成员,pair的数据是public的,两个成员分别是first和second,在map中,pair.first表示key,pair.second表示value。

⚠️map/multimap中的本身是有序的 是按key进行 升序排列的⚠️


map与set的异同

map与set的结构如图所示:



⚠️map和set的Key不可变,set的元素是const的,map中pair的第一个元素是const的。


map与multimap的异同

map 与 multimap是存储key-value(键-值 对)类型的容器。

不同之处在于:map只允许key与 value一一对应;multimap一个key可对应多个value

⚠️上述使其不同之处,下面如果,不作特别说明,适用于map的都适用于multimap(见代码)


map类对象的构造

  1. //map最基本的构造函数
  2. map<string,int> mp1;
  3. map<char,int> mp2;
  4. map<int,char> mp3;
  5. map<int,string> mp4;
  6. map<double,int> mp5;

map添加元素

  1. //map的添加元素
  2. //第一个pair添加法
  3. mp1.insert(pair<string,int>("aaa",100));
  4. mp2.insert(pair<char,int>('a',100));
  5. mp3.insert(pair<int,char>(100,'b'));
  6. mp4.insert(pair<int,string>(100,"BBB"));
  7. mp5.insert(pair<double,int>(0.1,200));
  8. //第二种添加元素的方法 make_pair()
  9. map<string,int> mp;
  10. mp.insert(make_pair("AA",100));
  11. map<int,double> mmp;
  12. mmp.insert(make_pair(1,0.2));
  13. //第三种临时map对象value_type添加元素法
  14. mp1.insert(map<string,int>::value_type("bbb",200));
  15. mp2.insert(map<char,int>::value_type('b',100));
  16. mp3.insert(map<int,char>::value_type(100,'b'));
  17. mp4.insert(map<int,string>::value_type(100,"BBB"));
  18. mp5.insert(map<double,int>::value_type(0.2,400));
  19. //map中最简单常用的添加元素方法(类似于数组的赋值)
  20. //这个非常方便啊,如果 mp1对象中无"one"键值时创建one键值,若已经有 one键值,则可以对键所对应的值,!!!!进行修改、赋值!!!!!
  21. mp1["one"] = 1;
  22. mp2['a'] = 100;
  23. mp3[1] = 'c';
  24. mp4[10] = "EEE";
  25. mp5[0.2] = 200;

map元素的遍历

  1. //map元素的遍历
  2. for(map<string,int>::iterator it = mp1.begin();it != mp1.end();it++)
  3. {
  4. cout<<it->first<<" "<<it->second<<endl;
  5. }

map元素的查找、更改、删除

  1. //map元素中的查找 find函数 返回一个指向键的值为key的元素的迭代器,如果没有找到返回指向超尾的迭代器
  2. map<string,int>::iterator mit = mp1.find("aaa");
  3. if(mit != mp1.end()) //mit 不指向超尾,成功找到
  4. cout<<mit->second<<endl; //注意这里的 mit指针必须用“ -> ” 来访问second函数,且该函数是没有括号的
  5. else
  6. cout<<"Sorry\n";
  7. map<double,int>::iterator it_5 = mp5.find(0.2);
  8. if(it_5 != mp5.end())
  9. cout<<it_5->first<<" "<<it_5->second<<endl;
  10. it_5->second = 999; //可以修改键所对应的 的值
  11. cout<<it_5->first<<" "<<it_5->second<<endl;
  12. //it_5->first = 0.3; //但是去不可以,更改 键 值
  13. //cout<<it_5->first<<" "<<it_5->second<<endl;
  14. //map中元素的删除 erase(指向键值的指针) //删除该指针指向的元素
  15. //mp5.erase(it_5);
  16. map<double,int>::iterator it =mp5.find(0.2);
  17. if(it == mp5.end()) // 如果it指向mp5.end()
  18. cout<<"成功删除it_5指向的元素"<<endl;

map容器间元素的交换

  1. //同类型map的容器内容的交换
  2. map<string,int> m1;
  3. map<string,int> m2;
  4. map<string,int> m3;
  5. map<string,int> m4;
  6. m1.insert(pair<string,int>("A",100));
  7. m1.insert(map<string,int>::value_type("B",200));
  8. m1["C"] = 200;
  9. m1["C"]++; //使 m1["C"] 的value值增加一,此时m1["A"] = 201;
  10. m2.insert(pair<string,int>("X",777));
  11. m2.insert(map<string,int>::value_type("Y",888));
  12. m2["Z"] = 999;
  13. m2["Z"]++; //使 m1["Z"] 的value值增加一,此时m2["Z"] = 1000;
  14. m1.swap(m2); //此时 m1于m2的内容进行交换,⚠️该函数只能对两个容器的内容进行交换
  15. for(map<string,int>::iterator it = m1.begin(); it != m1.end();it++)
  16. cout<<it->first<<" "<<it->second<<endl;

map中常用函数

  1. //map中常见的函数
  2. //1. begin(), end();
  3. //2. rbegin(), rend();
  4. //3. clear() 清除容器中所有元素
  5. //4. count(参数类型为:key) 返回map中的某个值的数量
  6. cout<<endl;
  7. cout<<"m1.count: "<<m1.count("Z")<<endl; //输出键为"Z"的值
  8. //5. empty() 容器为空返回true
  9. //6. equal_range() 返回特殊条目的迭代器
  10. pair<map<string,int>::iterator,map<string,int>::iterator> pir = m1.equal_range("X");
  11. cout<<pir.first->first<<" "<<pir.first->second;
  12. cout<<pir.second->first<<" "<<pir.second->second;
  13. //7. size() 返回容器元素的个数
  14. //8. 比较两个key值的大小函数、value_comp() 比较map元素 值value 的函数
  15. //8. lower_bound(参数:key) 返回指向 >=key 的第最后一个满足大于等于键的位置的迭代器
  16. upper_bound(参数:key)返回指向 >key 的第一个大于key的位置的迭代器
  17. map<string,int> mm1;
  18. mm1["AAA"] = 1;mm1["BBB"] = 2;mm1["CCC"] = 3;
  19. mm1["DDD"] = 4;mm1["AAA"]--;
  20. cout<<mm1.upper_bound("CCC")->first<<" "<<mm1.upper_bound("CCC")->second<<endl;
  21. cout<<mm1.lower_bound("CCC")->first<<" "<<mm1.lower_bound("CCC")->second<<endl;
  22. /*输出:
  23. DDD 4
  24. CCC 3
  25. */

multimap实例应用讲解

  1. class Person
  2. {
  3. public:
  4. string name;
  5. int age;
  6. string tel;
  7. int salary;
  8. };
  9. Person p1,p2,p3,p4,p5;
  10. p1.name = "A";p1.age = 10;
  11. p2.name = "B";p2.age = 11;
  12. p3.name = "C";p3.age = 12;
  13. p4.name = "D";p4.age = 13;
  14. p5.name = "E";p5.age = 14;
  15. //
  16. multimap<string,Person> mp;
  17. mp.insert(make_pair("Sale",p1));
  18. mp.insert(make_pair("Sale",p2)); //⚠️这里 mp 如果不是multimap的这一条指令会插入失败(因为键值重复)
  19. mp.insert(make_pair("Development",p3));
  20. mp.insert(make_pair("Development",p4));//⚠️这里 mp 如果不是multimap的这一条指令会插入失败
  21. mp.insert(make_pair("Fiancial",p5));
  22. //遍历
  23. for(map<string,Person>::iterator it = mp.begin(); it != mp.end() ; it++)
  24. {
  25. cout<<it->first<<"\t"<<it->second.name<<"\t"<<it->second.age<<endl;
  26. }
  27. //计算键为 Development 的元素的个数
  28. int num = mp.count("Development");
  29. cout<<num<<endl;
  30. //查看、更改元素值(通过迭代器直接访问地址进行修改)
  31. //例1:输出键为 Development 元素的值
  32. map<string,Person>::iterator it_1 = mp.find("Development");
  33. while(num--)
  34. {
  35. cout<<it_1->first<<"\t"<<it_1->second.name<<"\t"<<it_1->second.age<<endl;
  36. it_1++;
  37. }
  38. //例2:更改键值为 Sale 的值的名字
  39. for(map<string,Person>::iterator it = mp.begin(); it != mp.end() ; it++)
  40. {
  41. if(it->first == "Sale")
  42. it->second.name = "Sale_" + it->second.name;
  43. //输出修改后的结果
  44. cout<<it->first<<"\t"<<it->second.name<<"\t"<<it->second.age<<endl;
  45. }

特别提醒

map的sort问题,map中的元素是按键key进行升序排序的,所以不能对map用sort函数

map更深入探究

STL——map源码剖析(传送门)


STL(六)——map、multimap的更多相关文章

  1. STL:map/multimap用法详解

    map/multimap 使用map/multimap之前要加入头文件#include<map>,map和multimap将key/value当作元素,进行管理.它们可根据key的排序准则 ...

  2. STL之map&multimap使用简介

    map 1.insert 第一种:用insert函数插入pair数据 #include <map> #include <string> #include <iostrea ...

  3. 【STL】-Map/Multimap的用法

    初始化: map<string,double> salaries; 算法: 1. 赋值.salaries[ "Pat" ] = 75000.00; 2. 无效的索引将自 ...

  4. 【C++ STL】Map和Multimap

    1.结构 Map和multimap将key/value pair(键值/实值 队组)当作元素,进行管理.他们根据key的排序准则将元素排序.multimap允许重复元素,map不允许. 元素要求: k ...

  5. STL中的map/multimap小结

    (1)使用map/multimap之前必须包含头文件<map>:#include<map> 并且和所有的关联式容器一样,map/multimap通常以平衡二叉树来完成 (2)n ...

  6. iBinary C++STL模板库关联容器之map/multimap

    目录 一丶关联容器map/multimap 容器 二丶代码例子 1.map的三种插入数据的方法 3.map集合的遍历 4.验证map集合数据是否插入成功 5.map数据的查找 6.Map集合删除元素以 ...

  7. STL之Map和multimap容器

    1.Map和multimap容器 1)map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. 2)map中key值是唯一的.集合中的元素按一 ...

  8. STL中 map 和 multimap

    1. 所在头文件<map>. 命名空间std, 声明如下: namespace std{ template <class Key,class T, class Compare = l ...

  9. STL之六:map/multimap用法详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8547007 map/multimap 使用map/multimap之前要加入头文件# ...

  10. STL——容器(Map & multimap)的删除

    Map & multimap 的删除 map.clear();           //删除所有元素 map.erase(pos);      //删除pos迭代器所指的元素,返回下一个元素的 ...

随机推荐

  1. SpringBoot1.5.10.RELEASE整合druid

    1.先在pom文件中导入druid的jar包 <dependency> <groupId>com.alibaba</groupId> <artifactId& ...

  2. form表单提交没有跨域问题,但ajax提交存在跨域问题

    浏览器的策略本质是:一个域名下面的JS,没有经过允许是不能读取另外一个域名的内容,但是浏览器不阻止你向另外一个域名发送请求. 所以form表单提交没有跨域问题,提交form表单到另外一个域名,原来页面 ...

  3. HDFS文件系统基操--Java实现

    Java实现对HDFS文件系统的基本操作 1.准备好jar包 2.创建一个类 1. 测试连接 @Test //测试是否连接成功 public void test() { //添加配置 ==> c ...

  4. AX中Json转化成表记录

    static void JsonToTable(str _json,Common _Common){    sysdictTable        dictTable;    TableId      ...

  5. Polly每次重试执行不同的操作

    Polly每次重试执行不同的操作 前言   最近在写WG(用的 .net core 3.1 + wpf + abp vnext),程序里大量用到了重试机制选用的是Polly组件(只知道这个...). ...

  6. 源码分析 Sentinel 之 Dubbo 适配原理

    目录 1.源码分析 SentinelDubboConsumerFilter 2.源码分析 SentienlDubboProviderFilters 3.Sentienl Dubbo FallBack ...

  7. 解决不管其他元素z-index设置多高,都在视频下面的方法

    <div style="z-index:-1"> <embed name="Movie1" src="http://ecards.s ...

  8. tars之springboot的初步使用

    公司要求使用tars框架,现学习的,听老大讲的经验和看的一些技术博客,感觉和SpringCloud有些相似,不过内部有自己的规范,基于rpc实现的服务与服务之间的远程调用,而cloud的远程调用是基于 ...

  9. Natas27 Writeup(mysql溢出截断漏洞)

    Natas27: 一个登录节界面,查看源码. <html> <head> <!-- This stuff in the header has nothing to do ...

  10. Mybatis(二) Mybatis通用的写法

    2.1 用来循环容器的标签forEach,查看例子   foreach元素的属性主要有item,index,collection,open,separator,close. item:集合中元素迭代时 ...