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 <map>
  2. void printMap(map<int,int>&m)
  3. {
  4. for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
  5. {
  6. cout << "key = " << it->first << " value = " << it->second << endl;
  7. }
  8. cout << endl;
  9. }
  10. void test01()
  11. {
  12. map<int,int>m; //默认构造
  13. m.insert(pair<int, int>(1, 10));
  14. m.insert(pair<int, int>(2, 20));
  15. m.insert(pair<int, int>(3, 30));
  16. printMap(m);
  17. map<int, int>m2(m); //拷贝构造
  18. printMap(m2);
  19. map<int, int>m3;
  20. m3 = m2; //赋值
  21. printMap(m3);
  22. }
  23. int main() {
  24. test01();
  25. system("pause");
  26. return 0;
  27. }

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

3.9.3 map大小和交换

功能描述:

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

函数原型:

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

示例:

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

总结:

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

3.9.4 map插入和删除

功能描述:

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

函数原型:

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

示例:

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

总结:

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

  • 插入 —- insert

  • 删除 —- erase
  • 清空 —- clear

3.9.5 map查找和统计

功能描述:

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

函数原型:

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

示例:

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

总结:

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

3.9.6 map容器排序

学习目标:

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

主要技术点:

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

示例:

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

总结:

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