c++笔记 容器 map

50 篇文章 4 订阅

一、map容器的特点

1、所有元素都会根据元素的键值自动排序

2、所有的元素都是pair,同时拥有键值和实值。 第一个参数:键值 第二个参数:实值

3、map容器的键值唯一 不可变 实值 可变。

二、map容器的插入、遍历 

 
  1. void test()

  2. {

  3. /*

  4. map/multimap常用API

  5. map构造函数

  6. map<T1, T2> mapTT;//map默认构造函数:

  7. map(const map &mp);//拷贝构造函数

  8. map赋值操作

  9. map& operator=(const map &mp);//重载等号操作符

  10. swap(mp);//交换两个集合容器

  11. map大小操作

  12. size();//返回容器中元素的数目

  13. empty();//判断容器是否为空

  14. map插入数据元素操作

  15. map.insert(...); //往容器插入元素,返回pair<iterator,bool>

  16. map<int, string> mapStu;

  17. //第一种 通过pair的方式插入对象

  18. mapStu.insert(pair<int, string>(3, "小张"));

  19. // 第二种 通过pair的方式插入对象

  20. mapStu.inset(make_pair(‐1, "校长"));

  21. // 第三种 通过value_type的方式插入对象

  22. mapStu.insert(map<int, string>::value_type(1, "小李"));

  23. // 第四种 通过数组的方式插入值

  24. mapStu[3] = "小刘";

  25. mapStu[5] = "小王";

  26. map删除操作

  27. clear();//删除所有元素

  28. erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。

  29. erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。

  30. erase(keyElem);//删除容器中key为keyElem的对组。

  31. map查找操作

  32. find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回m

  33. ap.end();

  34. count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是

  35. 对multimap来说,值可能大于1。

  36. lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。

  37. upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。

  38. equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

  39. */

  40. //存放9527‐‐"星爷" 10086‐"移动" 10010‐‐"联通" 10000‐‐"电信"

  41. //int为键值的类型 string为实值的类型

  42. map<int, string> m;

  43. //第1种:

  44. m.insert(pair<int, string>(9527, "星爷"));

  45. //第2种:(推荐)

  46. m.insert(make_pair(10086, "移动"));

  47. //第3种:

  48. m.insert(map<int, string>::value_type(10010, "联通"));

  49. //第4种:读map容器数据的时候 推荐

  50. m[10000] = "电信";//m.insert(make_pair(10000,"电信"));

  51. //m[10] 寻找key为10的实值

  52. //但是:如果容器中没有key为10 使用m[10] 会创建一个key为10实值为空的 对组

  53. //如果容器中有key为10 那么m[10]代表key=10的实值

  54. //建议:10是存在的

  55. cout << m[10] << endl;

  56. myPrintMap01(m);

  57. #if 0

  58. for_each(m.begin(), m.end(), [](pair<int, string> val) {

  59. cout << "key=" << val.first << ", value=" << val.second << endl;

  60. });

  61. #endif

  62. //只想查看key==9527 的实值 (保证key是存在的)

  63. cout << m[9527] << endl;//"星爷"

  64. cout << m[10010] << endl;//"联通"

  65. //如果不能确定key值是否存在

  66. map<int, string>::const_iterator ret;

  67. ret = m.find(10086);

  68. if (ret == m.end())

  69. {

  70. cout << "未找到相关节点" << endl;

  71. }

  72. else

  73. {

  74. //ret代表的是key=10086的对组的迭代器

  75. cout << "找到相关节点:key=" << (*ret).first << ", value=" << (*ret).second << endl;

  76. }

  77. }

 三、multimap案例

公司今天招聘了 5 个员工,5 名员工进入公司之后,需要指派员工在那个部门工作 人员信息有: 姓名 年龄 电话 工资等组成 通过 Multimap 进行信息的插入 保存 显示 分部门显示员工信息 显示全部员工信息

 
  1. #include<iostream>

  2. #include<map>

  3. #include<algorithm>

  4. #include<time.h>

  5. #include<string>

  6. #include<vector>

  7. using namespace std;

  8. #define SALE_DEPATMENT 1 //销售部门

  9. #define DEVELOP_DEPATMENT 2 //研发部门

  10. #define FINACIAL_DEPATMENT 3 //财务部门

  11. #define ALL_DEPATMENT 4 //所有部门

  12. class Person {

  13. public:

  14. string name;

  15. int age;

  16. double salary;

  17. string tele;

  18. };

  19. //创建五个员工

  20. void createperson(vector<Person> worker)

  21. {

  22. string tmp = "ABCDE";

  23. for (int i = 0; i < tmp.size(); ++i)

  24. {

  25. Person p;

  26. p.name = "员工";

  27. p.name += tmp[i];

  28. p.age = rand() % 30 + 20;

  29. p.salary = rand() % 20000 + 10000;

  30. p.tele = "010-8888888";

  31. worker.push_back(p);

  32. }

  33. }

  34. //5 名员工分配到不同的部门

  35. void Personbygroup(vector<Person> &list, multimap<int, Person> &plist)

  36. {

  37. int operate = -1;//用户的操作

  38. for (vector<Person>::iterator it; it != list.end(); it++)

  39. {

  40. cout << "当前员工信息" << endl;

  41. cout << "姓名:" << it->name << "年龄:" << it->age << "工资"

  42. << it->salary << "电话" << it->tele << endl;

  43. cout << "请对该员工进行部门分配(1 销售部门, 2 研发部门, 3 财务部门):" << endl;

  44. cin >> operate;

  45. while (true)

  46. {

  47. if (operate == SALE_DEPATMENT) {

  48. plist.insert(make_pair(SALE_DEPATMENT, *it));

  49. break;

  50. }

  51. else if (operate == DEVELOP_DEPATMENT) {

  52. plist.insert(make_pair(DEVELOP_DEPATMENT, *it));

  53. break;

  54. }

  55. else if (operate == FINACIAL_DEPATMENT) {

  56. plist.insert(make_pair(FINACIAL_DEPATMENT, *it));

  57. break;

  58. }

  59. else {

  60. cout << "您的输入有误,请重新输入(1 销售部门, 2 研发部门, 3 财务部门):" << endl;

  61. cin >> operate;

  62. }

  63. }

  64. }

  65. cout << "员工部门分配完毕!" << endl;

  66. cout << "***********************************************************" << endl;

  67. }

  68. //打印员工信息

  69. void Printlist(multimap<int, Person> &mlist , int myoperate)

  70. {

  71. if (myoperate == ALL_DEPATMENT) {

  72. for (multimap<int, Person>::iterator it = mlist.begin(); it != mlist.end(); it++)

  73. {

  74. cout << "姓名:" << it->second.name << " 年龄:" << it->second.age

  75. << " 工资:" << it->second.salary << " 电话:" << it->second.tele << endl;

  76. }

  77. return;

  78. }

  79. multimap<int, Person>::iterator it = mlist.find(myoperate);

  80. int depatCount = mlist.count(myoperate);

  81. int num = 0;

  82. if (it != mlist.end()) {

  83. while (it != mlist.end() && num < depatCount) {

  84. cout << "姓名:" << it->second.name << " 年龄:" << it->second.age \

  85. << " 工资:" << it->second.salary << " 电话:" << it->second.tele << endl;

  86. it++;

  87. num++;

  88. }

  89. }

  90. }

  91. //根据用户操作显示不同部门的人员列表

  92. void ShowPersonList(multimap<int, Person>& plist, int myoperate) {

  93. switch (myoperate)

  94. {

  95. case SALE_DEPATMENT:

  96. Printlist(plist, SALE_DEPATMENT);

  97. break;

  98. case DEVELOP_DEPATMENT:

  99. Printlist(plist, DEVELOP_DEPATMENT);

  100. break;

  101. case FINACIAL_DEPATMENT:

  102. Printlist(plist, FINACIAL_DEPATMENT);

  103. break;

  104. case ALL_DEPATMENT:

  105. Printlist(plist, ALL_DEPATMENT);

  106. break;

  107. }

  108. }

  109. //用户操作菜单

  110. void PersonMenue(multimap<int, Person>& plist) {

  111. int flag = -1;

  112. int isexit = 0;

  113. while (true) {

  114. cout << "请输入您的操作((1 销售部门, 2 研发部门, 3 财务部门, 4所有部门, 0 退出):" << endl;

  115. cin >> flag;

  116. switch (flag)

  117. {

  118. case SALE_DEPATMENT:

  119. ShowPersonList(plist, SALE_DEPATMENT);

  120. break;

  121. case DEVELOP_DEPATMENT:

  122. ShowPersonList(plist, DEVELOP_DEPATMENT);

  123. break;

  124. case FINACIAL_DEPATMENT:

  125. ShowPersonList(plist, FINACIAL_DEPATMENT);

  126. break;

  127. case ALL_DEPATMENT:

  128. ShowPersonList(plist, ALL_DEPATMENT);

  129. break;

  130. case 0:

  131. isexit = 1;

  132. break;

  133. default:

  134. cout << "您的输入有误,请重新输入!" << endl;

  135. break;

  136. }

  137. if (isexit == 1) {

  138. break;

  139. }

  140. }

  141. }

  142. int main()

  143. {

  144. vector<Person> vlist; //创建的 5 个员工 未分组

  145. multimap<int, Person> plist; //保存分组后员工信息

  146. //创建 5 个员工

  147. createperson(vlist);

  148. //5 名员工分配到不同的部门

  149. Personbygroup(vlist, plist);

  150. //根据用户输入显示不同部门员工信息列表 或者 显示全部员工的信息列表

  151. PersonMenue(plist);

  152. system("pause");

  153. return 0;

  154. }

四、STL 容器使用时机

vector 的使用场景:比如软件历史操作记录的存储,我们经常要查看历史记录, 比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描 述。

deque 的使用场景:比如排队购票系统,对排队者的存储可以采用 deque, 支持头端的快速移除,尾端的快速添加。如果采用 vector,则头端移除时,会移动 大量的数据,速度慢。

vector 与 deque 的比较: 一:vector.at()比 deque.at() 效率高,比如 vector.at(0)是固定的,deque 的开始位置 却是不固定的。

二:如 果有大量释放操作的话,vector 花的时间更少,这跟二者的内部实现有关。

三: deque 支持头部的快速插入与快速移除,这是 deque 的优点。 list 的使用场景: 比如公交车乘客的存储,随时可能有乘客下车,支持频繁的不确实位置元素的移除 插入。

set 的使用场景:比如对手机游戏的个人得分记录的存储,存储要求从高 分到低分的顺序排列。 map 的使用场景:比如按 ID 号存储十万个用户,想要 快速要通过 ID 查找对应的用户。二叉树的查找效率,这时就体现出来了。如果是 vector 容器,最坏的情况下可能要遍历完整个容器才能找到该用户。

(486条消息) c++笔记 容器 map_tranquilllll的博客-CSDN博客_c++ map容器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值