C++进阶STL-map、multimap

桃扇骨 2022-05-09 09:12 329阅读 0赞

map、multimap容器

  • (1)map相对于set来说,map具有键值和实值,将元素组合成pair再插入到map容器,pair的第一个元素被称为键值,第二个元素被称为实值。
  • (2)map也是以红黑树为底层的实现机制,map容器根据插入元素的键值会自动排序,如果不是普通类型,需要自定义规则
  • (3)map的键值不可以重复,实值可以重复,multimap键值实值都可以重复
  • (4)map的键值不可修改,可以改变实值,想修改键值只有删除再插入

map构造函数

  • map mymap   //默认构造
  • map(const map& mymap) //拷贝构造

map赋值

  • map& operator(const map& mymap) //重载=操作符
  • swap(mymap) //交换两个容器

map大小

  • size() //返回容器中元素的个数
  • empty() //判断容器是否为空

map插入元素

  • mymap.insert( pair(T1实例,T2实例) )
  • mymap.insert( make_pair(T1实例,T2实例))
  • mymap.insert( map::value_type(T1实例,T2实例))
  • mymap[T1实例]=T2实例

    map< int, int>mymap;

    1. //方法1
    2. mymap.insert(pair<int, int>(10, 10));
    3. //方法2
    4. mymap.insert(make_pair(20, 20));
    5. //方法3
    6. mymap.insert(map<int, int>::value_type(30, 30));
    7. //方法4
    8. mymap[40] = 40;
  1. for (map<int, int>::iterator it = mymap.begin(); it != mymap.end(); it++)
  2. {
  3. cout << "key is: " << it->first << ";"<< " value is :" << it->second << endl;
  4. }

结果:
在这里插入图片描述

NOTE:

  • 如果用mymap.insert插入相同key的元素不会成功
  • 但是用 mymap[40]=10 去插入,如果容器中有相同的key值的元素,则修改此元素的value值为10
  • 如果访问map容器中没有的元素,如:cout << “mymap[50]:” << mymap[50] << endl;,容器会添加key=50的元素,value值初始化为0

map元素删除

  • clear()  //清除所有元素
  • erase(pos)  //删除pos迭代器所指的元素,返回下一个元素的迭代器
  • erase(begin(),end() );  //删除[begin end]之间的所有元素,返回下一个元素的迭代器
  • erase(key) //删除容器中键值为key的元素

map元素查找

  • find(key)   //查找key键值是否存在,若存在返回第一次出现该键的元素的迭代器,若不存在,返回map.end()
  • count(key) //返回容器中键值为key的元素的个数,对于map来说要么0,要么1,对于multimap来说有可能大于1
  • lower_bound(key) //返回第一个键值 >= key 的元素的迭代器 @1
  • upper_bound(key) //返回第一个键值 > key 的元素的迭代器 @2
  • equal_range(key)  //返回pair<@1,@2 >

实例: 在1 2 3 4 中equal_range(2) ,第一个>=2 的是2,第一个> 2是3,应该返回 2 , 3

  1. map<int, int> mymap;
  2. mymap.insert(make_pair(1,10));
  3. mymap.insert(make_pair(2,20));
  4. mymap.insert(make_pair(3,30));
  5. mymap.insert(make_pair(4, 40));
  6. pair<map<int, int>::iterator, map<int, int>::iterator> mypair = mymap.equal_range(2);
  7. cout << mypair.first->first << " : "<< mypair.first->second << endl;
  8. cout << mypair.second->first<< " : " << mypair.second->second << endl;

结果:
在这里插入图片描述

map容器的自定义排序规则

  1. #include "stdafx.h"
  2. #include <map>
  3. #include <iostream>
  4. using namespace std;
  5. class Key
  6. {
  7. public:
  8. Key(int ID, int age):m_ID(ID),m_age(age) { }
  9. int m_ID;
  10. int m_age;
  11. };
  12. struct Compare //自定义的规则,用Key.m_age排序 ,从小到大
  13. {
  14. bool operator()(const Key& key1, const Key& key2)
  15. {
  16. return key1.m_age < key2.m_age;
  17. }
  18. };
  19. int main()
  20. {
  21. map<Key, int, Compare> mymap;
  22. mymap.insert(make_pair(Key(1, 1), 1));
  23. mymap.insert(make_pair(Key(2, 2), 2));
  24. mymap.insert(make_pair(Key(3, 3), 3));
  25. mymap.insert(make_pair(Key(4, 4), 4));
  26. for (map<Key, int, Compare>::iterator it=mymap.begin(); it != mymap.end(); it++)
  27. {
  28. cout << it->first.m_age << " : " << it->first.m_ID << " : " << it->second << endl;
  29. }
  30. return 0;
  31. }

结果:struct Compare 返回的是 return key1.m_age < key2.m_age;

在这里插入图片描述

结果:struct Compare 返回的是 return key1.m_age > key2.m_age;
在这里插入图片描述

map容器的综合小实例

  • 给5个员工分配部门,每个员工具有:姓名,电话,年龄,薪水
  • 部门有三个:销售部,研发部,财务部
  • 按照部门打印出每个员工的信息

    include “stdafx.h”

    include

    include

    include

    include

    include

  1. using namespace std;
  2. #define SALE_DEPARTMENT 1
  3. #define DEVELOP_DEPARTMENT 2
  4. #define FINACIAL_DEPARTMENT 3
  5. class Worker
  6. {
  7. public:
  8. string m_name;
  9. string m_tele;
  10. int m_age;
  11. int m_salary;
  12. };
  13. //创建员工
  14. void Creat_Worker(vector<Worker>& Workers)
  15. {
  16. string seed = "ABCDE";
  17. for (int i = 0; i < 5; i++)
  18. {
  19. Worker Wok;
  20. Wok.m_name = "员工";
  21. Wok.m_name+=seed[i];
  22. Wok.m_age = rand() % 10 + 20;
  23. Wok.m_salary = rand() % 10000 + 10000;
  24. Wok.m_tele = "010-73829783";
  25. Workers.push_back(Wok);
  26. }
  27. }
  28. //员工分组
  29. void Worker_Group(vector<Worker>& Workers, multimap <int, Worker>& Workergroup)
  30. {
  31. srand(time(NULL));
  32. for (vector<Worker>::iterator it = Workers.begin(); it != Workers.end(); it++)
  33. {
  34. int DeparID = rand() % 3 + 1;
  35. switch (DeparID)
  36. {
  37. case SALE_DEPARTMENT:
  38. Workergroup.insert(make_pair(SALE_DEPARTMENT, (*it)));
  39. break;
  40. case DEVELOP_DEPARTMENT:
  41. Workergroup.insert(make_pair(DEVELOP_DEPARTMENT, (*it)));
  42. break;
  43. case FINACIAL_DEPARTMENT:
  44. Workergroup.insert(make_pair(FINACIAL_DEPARTMENT, (*it)));
  45. break;
  46. default:
  47. break;
  48. }
  49. }
  50. }
  51. //打印部门员工
  52. void ShowWorkers(multimap <int, Worker>& Workergroup, int dep)
  53. {
  54. //打印销售部SALE_DEPARTMENT
  55. multimap<int, Worker>::iterator it = Workergroup.find(dep);
  56. int num = Workergroup.count(dep);
  57. for (it; it != Workergroup.end() && num != 0; it++, num--)
  58. {
  59. cout << "name: " << it->second.m_name << endl;
  60. cout << "age:" << it->second.m_age << endl;
  61. cout << "salary:" << it->second.m_salary << endl;
  62. cout << "tel:" << it->second.m_tele << endl;
  63. }
  64. }
  65. //打印每个部门的员工信息
  66. void Print_Worker(multimap <int, Worker>& Workergroup)
  67. {
  68. cout << "---------------销售部---------------" << endl;
  69. ShowWorkers(Workergroup, SALE_DEPARTMENT);
  70. cout << "---------------研发部---------------" << endl;
  71. ShowWorkers(Workergroup, DEVELOP_DEPARTMENT);
  72. cout << "---------------财务部---------------" << endl;
  73. ShowWorkers(Workergroup, FINACIAL_DEPARTMENT);
  74. }
  75. int main()
  76. {
  77. vector<Worker> Workers;
  78. multimap <int, Worker> Workergroup;
  79. //创建员工
  80. Creat_Worker(Workers);
  81. //员工分组
  82. Worker_Group(Workers, Workergroup);
  83. //打印每个部门的员工信息
  84. Print_Worker(Workergroup);
  85. return 0;
  86. }

结果:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,329人围观)

还没有评论,来说两句吧...

相关阅读