bilibiliC++65-69_STL常用容器_map/ multimap容器

悠悠 2022-10-30 02:28 258阅读 0赞

3.9 map/ multimap容器

3.9.1 map基本概念

简介:

  • map中所有元素都是pair
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序

本质:

  • map/multimap属于关联式容器,底层结构是用二叉树实现。

优点:

  • 可以根据key值快速找到value值

map和multimap区别

  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

3.9.2 map构造和赋值

功能描述:

  • 对map容器进行构造和赋值操作

函数原型:

构造:

  • map<T1, T2> mp; //map默认构造函数:
  • map(const map &mp); //拷贝构造函数

赋值:

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

示例:

  1. #include<iostream>
  2. using namespace std;
  3. #include <map>
  4. void printMap(map<int, int>& m)
  5. {
  6. for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
  7. {
  8. cout << "key = " << it->first << " value = " << it->second << endl;
  9. }
  10. cout << endl;
  11. }
  12. void test01()
  13. {
  14. map<int, int>m; //默认构造
  15. m.insert(pair<int, int>(1, 10));
  16. m.insert(pair<int, int>(2, 20));
  17. m.insert(pair<int, int>(3, 30));
  18. printMap(m);
  19. map<int, int>m2(m); //拷贝构造
  20. printMap(m2);
  21. map<int, int>m3;
  22. m3 = m2; //赋值
  23. printMap(m3);
  24. }
  25. int main() {
  26. test01();
  27. system("pause");
  28. return 0;
  29. }
  30. /* key = 1 value = 10 key = 2 value = 20 key = 3 value = 30 key = 1 value = 10 key = 2 value = 20 key = 3 value = 30 key = 1 value = 10 key = 2 value = 20 key = 3 value = 30 请按任意键继续. . . */

总结:map中所有元素都是成对出现,插入数据时候要使用对组

3.9.3 map大小和交换

功能描述:

  • 统计map容器大小以及交换map容器

函数原型:

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器

示例:

  1. #include<iostream>
  2. using namespace std;
  3. #include <map>
  4. void printMap(map<int, int>& m)
  5. {
  6. for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
  7. {
  8. cout << "key = " << it->first << " value = " << it->second << endl;
  9. }
  10. cout << endl;
  11. }
  12. void test01()
  13. {
  14. map<int, int>m;
  15. m.insert(pair<int, int>(1, 10));
  16. m.insert(pair<int, int>(2, 20));
  17. m.insert(pair<int, int>(3, 30));
  18. if (m.empty())
  19. {
  20. cout << "m为空" << endl;
  21. }
  22. else
  23. {
  24. cout << "m不为空" << endl;
  25. cout << "m的大小为: " << m.size() << endl;
  26. }
  27. }
  28. //交换
  29. void test02()
  30. {
  31. map<int, int>m;
  32. m.insert(pair<int, int>(1, 10));
  33. m.insert(pair<int, int>(2, 20));
  34. m.insert(pair<int, int>(3, 30));
  35. map<int, int>m2;
  36. m2.insert(pair<int, int>(4, 100));
  37. m2.insert(pair<int, int>(5, 200));
  38. m2.insert(pair<int, int>(6, 300));
  39. cout << "交换前" << endl;
  40. printMap(m);
  41. printMap(m2);
  42. cout << "交换后" << endl;
  43. m.swap(m2);
  44. printMap(m);
  45. printMap(m2);
  46. }
  47. int main() {
  48. test01();
  49. test02();
  50. system("pause");
  51. return 0;
  52. }
  53. /* m不为空 m的大小为: 3 交换前 key = 1 value = 10 key = 2 value = 20 key = 3 value = 30 key = 4 value = 100 key = 5 value = 200 key = 6 value = 300 交换后 key = 4 value = 100 key = 5 value = 200 key = 6 value = 300 key = 1 value = 10 key = 2 value = 20 key = 3 value = 30 请按任意键继续. . . */

总结:

  • 统计大小 — size
  • 判断是否为空 — empty
  • 交换容器 — swap

3.9.4 map插入和删除

功能描述:

  • map容器进行插入数据和删除数据

函数原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(key); //删除容器中值为key的元素。

示例:

  1. #include<iostream>
  2. using namespace std;
  3. #include <map>
  4. void printMap(map<int, int>& m)
  5. {
  6. for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
  7. {
  8. cout << "key = " << it->first << " value = " << it->second << endl;
  9. }
  10. cout << endl;
  11. }
  12. void test01()
  13. {
  14. //插入
  15. map<int, int> m;
  16. //第一种插入方式
  17. m.insert(pair<int, int>(1, 10));
  18. //第二种插入方式
  19. m.insert(make_pair(2, 20));
  20. //第三种插入方式
  21. m.insert(map<int, int>::value_type(3, 30));
  22. //第四种插入方式
  23. m[4] = 40;
  24. printMap(m);
  25. //删除
  26. m.erase(m.begin());
  27. printMap(m);
  28. m.erase(3);
  29. printMap(m);
  30. //清空
  31. m.erase(m.begin(), m.end());
  32. m.clear();
  33. printMap(m);
  34. }
  35. int main() {
  36. test01();
  37. system("pause");
  38. return 0;
  39. }
  40. /* key = 1 value = 10 key = 2 value = 20 key = 3 value = 30 key = 4 value = 40 key = 2 value = 20 key = 3 value = 30 key = 4 value = 40 key = 2 value = 20 key = 4 value = 40 请按任意键继续. . . */

总结:

  • map插入方式很多,记住其一即可

  • 插入 — insert

  • 删除 — erase
  • 清空 — clear

3.9.5 map查找和统计

功能描述:

  • 对map容器进行查找数据以及统计数据

函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
  • count(key); //统计key的元素个数

示例:

  1. #include<iostream>
  2. using namespace std;
  3. #include <map>
  4. //查找和统计
  5. void test01()
  6. {
  7. map<int, int>m;
  8. m.insert(pair<int, int>(1, 10));
  9. m.insert(pair<int, int>(2, 20));
  10. m.insert(pair<int, int>(3, 30));
  11. //查找
  12. map<int, int>::iterator pos = m.find(3);
  13. if (pos != m.end())
  14. {
  15. cout << "找到了元素 key = " << (*pos).first << " value = " << (*pos).second << endl;
  16. }
  17. else
  18. {
  19. cout << "未找到元素" << endl;
  20. }
  21. //统计
  22. int num = m.count(3);
  23. cout << "num = " << num << endl;
  24. }
  25. int main() {
  26. test01();
  27. system("pause");
  28. return 0;
  29. }
  30. /* 找到了元素 key = 3 value = 30 num = 1 请按任意键继续. . . */

总结:

  • 查找 — find (返回的是迭代器)
  • 统计 — count (对于map,结果为0或者1)

3.9.6 map容器排序

学习目标:

  • map容器默认排序规则为 按照key值进行 从小到大排序,掌握如何改变排序规则

主要技术点:

  • 利用仿函数,可以改变排序规则

示例:

  1. #include<iostream>
  2. using namespace std;
  3. #include <map>
  4. class MyCompare {
  5. public:
  6. bool operator()(int v1, int v2)const
  7. {
  8. return v1 > v2;
  9. }
  10. };
  11. void test01()
  12. {
  13. //默认从小到大排序
  14. //利用仿函数实现从大到小排序
  15. map<int, int, MyCompare> m;
  16. m.insert(make_pair(1, 10));
  17. m.insert(make_pair(2, 20));
  18. m.insert(make_pair(3, 30));
  19. m.insert(make_pair(4, 40));
  20. m.insert(make_pair(5, 50));
  21. for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {
  22. cout << "key:" << it->first << " value:" << it->second << endl;
  23. }
  24. }
  25. int main() {
  26. test01();
  27. system("pause");
  28. return 0;
  29. }
  30. /* key:5 value:50 key:4 value:40 key:3 value:30 key:2 value:20 key:1 value:10 请按任意键继续. . . */

总结:

  • 利用仿函数可以指定map容器的排序规则
  • 对于自定义数据类型,map必须要指定排序规则,同set容器

发表评论

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

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

相关阅读