• 【C++】map / multimap容器


    目录

    map 基本概念

    map 构造和赋值

    map 容器大小和交换

    map 插入和删除

    map 查找和统计

    map 排序


    map 基本概念

    简介

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

    本质

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

    优点

    • 可以根据 key 的值快速查找 value

    map 和 multimap 区别

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

    map 构造和赋值

    功能

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

    函数原型

    构造

    1. // map 默认构造函数
    2. map mp;
    3. // 拷贝构造函数
    4. map(const map& mp);

    赋值

    1. // 重载 = 操作符
    2. map& operator=(const map& mp);

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. void PrintMap(map<int,int>& m) {
    5. for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {
    6. // (*it).first it->first
    7. cout << "key:" << (*it).first << "value:" << it->second << endl;
    8. }
    9. cout << endl;
    10. }
    11. void test() {
    12. // 创建 map 容器,模板参数有两个
    13. map<int, int>m;
    14. m.insert(pair<int, int>(1, 10)); // 匿名对组,key 为 1,value 是 10
    15. m.insert(pair<int, int>(2, 20));
    16. m.insert(pair<int, int>(4, 40));
    17. m.insert(pair<int, int>(3, 30));
    18. // 会按照 key 自动排序
    19. PrintMap(m);
    20. // 拷贝构造
    21. map<int, int>m2(m);
    22. PrintMap(m2);
    23. // 重载 = 操作符
    24. map<int, int>m3;
    25. m3 = m2;
    26. PrintMap(m3);
    27. }
    28. int main() {
    29. test();
    30. system("pause");
    31. return 0;
    32. }

    运行结果:

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


    map 容器大小和交换

    功能

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

    函数原型

    1. // 返回容器中元素的数目
    2. size();
    3. // 判断容器是否为空
    4. empty();
    5. // 交换两个集合容器
    6. swap(st);

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. size_t Map_size(const map<int, int>& m);
    5. // 打印 map 容器元素
    6. void PrintMap(map<int,int>& m) {
    7. for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {
    8. // (*it).first it->first
    9. cout << "key:" << (*it).first << "value:" << it->second << endl;
    10. }
    11. cout << endl;
    12. }
    13. // 判断 map 容器是否为空
    14. void Map_empty(const map<int, int>& m) {
    15. // 判断容器是否为空
    16. if (m.empty()) {
    17. cout << "m 容器为空" << endl;
    18. }
    19. else {
    20. cout << "m 容器非空" << endl;
    21. cout << "map 容器中元素个数:" << Map_size(m) << endl;
    22. }
    23. }
    24. size_t Map_size(const map<int, int>& m) {
    25. return m.size();
    26. }
    27. void test() {
    28. map<int, int>m1;
    29. Map_empty(m1); // 为空
    30. // 插入一个数据
    31. m1.insert(pair<int, int>(1, 10));
    32. Map_empty(m1); // 非空
    33. cout << endl << "m1打印" << endl;
    34. PrintMap(m1);
    35. // 交换
    36. map<int, int>m2;
    37. m2.insert(pair<int, int>(1, 10));
    38. m2.insert(pair<int, int>(2, 20));
    39. m2.insert(pair<int, int>(3, 30));
    40. m2.insert(pair<int, int>(4, 40));
    41. m2.insert(pair<int, int>(5, 50));
    42. cout << "m2交换前:" << endl;
    43. PrintMap(m2);
    44. cout << "m2交换后:" << endl;
    45. m2.swap(m1);
    46. PrintMap(m2);
    47. }
    48. int main() {
    49. test();
    50. system("pause");
    51. return 0;
    52. }

    运行结果:


    map 插入和删除

    功能

    • map 容器进行插入数据和

    函数原型

    1. // 在容器中插入元素
    2. insert(elem);
    3. // 清除所有元素
    4. clear();
    5. // 删除 pos 迭代器所指的元素,返回下一个元素的迭代器
    6. erase(pos);
    7. // 删除区间 [beg, end) 的所有元素,返回下一个元素的迭代器
    8. erase(beg, end);
    9. // 删除容器中值为 key 的元素
    10. erase(key);

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. void PrintMap(map<int,int>& m) {
    5. for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {
    6. cout << "key:" << (*it).first << "value:" << it->second << endl;
    7. }
    8. cout << endl;
    9. }
    10. void test() {
    11. map<int, int>m1;
    12. // 插入
    13. // 第一种
    14. m1.insert(pair<int, int>(1, 10));
    15. // 第二种
    16. m1.insert(make_pair(2, 20));
    17. // 第三种
    18. m1.insert(map<int, int>::value_type(3, 30));
    19. // 第四种
    20. m1[4] = 40; // 不建议用来插入,可以用来访问(但要确定存在)
    21. // key = 5 value = 0
    22. //cout << m1[5] << endl; // 因为 key = 5 不存在,所以他会自己创建数据
    23. PrintMap(m1);
    24. // 删除 erase(beg); 传入迭代器
    25. m1.erase(m1.begin());
    26. PrintMap(m1); // key = 10 被删除
    27. // earse(key); 传入 key,把 key 对应的值删除
    28. m1.erase(4);
    29. PrintMap(m1);
    30. // erase(beg, end);
    31. m1.erase(m1.begin(), m1.end()); // 等于清空,方向迭代器
    32. PrintMap(m1);
    33. // 清空
    34. m1.clear();
    35. PrintMap(m1);
    36. }
    37. int main() {
    38. test();
    39. system("pause");
    40. return 0;
    41. }

     运行结果:


    map 查找和统计

    功能:

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

    函数原型:

    1. // 查找 key 是否存在
    2. // 存在,返回该键的元素的迭代器
    3. // 不存在,返回 map.end();
    4. find(key);
    5. // 统计 key 的元素个数
    6. count(key);

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. void test() {
    5. map<int, int>m1;
    6. m1.insert(make_pair(1, 10));
    7. m1.insert(make_pair(2, 20));
    8. m1.insert(make_pair(3, 30));
    9. m1.insert(make_pair(4, 40));
    10. // 查找
    11. map<int, int>::iterator pos = m1.find(3);
    12. if (pos != m1.end()) {
    13. cout << "找到 " << "key = " << pos->first << " value = " << (*pos).second << endl;
    14. }
    15. else {
    16. cout << "未找到" << endl;
    17. }
    18. // 统计,map 容器不允许有相同的 key
    19. // map 只能是 0 或 1
    20. // multimap count 可以 > 1
    21. int num = m1.count(1);
    22. cout << "num = " << num << endl; // 1
    23. }
    24. int main() {
    25. test();
    26. system("pause");
    27. return 0;
    28. }

    运行结果:


    map 排序

    map 容器默认排序规则为按照 key 从小到大排序,如何改变排序规则?

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

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. class MyCompare {
    5. public:
    6. bool operator()(int value1, int value2)const {
    7. return (value1 > value2);
    8. }
    9. };
    10. void test() {
    11. map<int, int>m1;
    12. m1.insert(make_pair(5, 50));
    13. m1.insert(make_pair(2, 20));
    14. m1.insert(make_pair(4, 40));
    15. m1.insert(make_pair(3, 30));
    16. m1.insert(make_pair(1, 10));
    17. // 默认升序
    18. for (map<int, int>::iterator it1 = m1.begin(); it1 != m1.end(); ++it1) {
    19. cout << "key = " << (*it1).first << " value = " << it1->second << endl;
    20. }
    21. cout << endl;
    22. // 降序
    23. map<int, int, MyCompare>m2;
    24. m2.insert(make_pair(5, 50));
    25. m2.insert(make_pair(2, 20));
    26. m2.insert(make_pair(4, 40));
    27. m2.insert(make_pair(3, 30));
    28. m2.insert(make_pair(1, 10));
    29. for (map<int, int, MyCompare>::iterator it2 = m2.begin(); it2 != m2.end(); ++it2) {
    30. cout << "key = " << (*it2).first << " value = " << it2->second << endl;
    31. }
    32. }
    33. int main() {
    34. test();
    35. system("pause");
    36. return 0;
    37. }

    运行结果:

  • 相关阅读:
    在线客服系统的优势
    第一次去曼谷旅游怎么玩?这份省钱攻略请收好
    ApacheCon Asia 2022 启动,7 场阿里云大数据 +AI 议题分享等你围观
    如何书写一篇好的博客?
    23 Python的shutil模块
    218. 扑克牌 - 记忆化概率dp
    华为正式捐赠欧拉:操作系统领域的重量级开源项目
    android 10车载桌面ActivityView触摸事件源码详解分析
    MySQL基础(一)---基础认知及操作
    创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现
  • 原文地址:https://blog.csdn.net/xuan3215/article/details/126138408