• C++ 学习(20)STL - map容器


    1、map容器

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

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

    map的优点:可以根据key值快速找到value值

    map与multimap区别:

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

    1.1、map常用接囗

    函数原型

    构造函数

    • map mp;        //map默认构造函数
    • map(const map &mp); //拷贝构造函数

    赋值

    • map& operator=(const map& mp);  //重载运算符=

    大小

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

    交换

    • swap(st); //交换两个map容器

    插入

    • insert(elem);//在容器中插入元素

    删除

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

    查找

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

    统计

    • count(key);  //统计key的元素个数
    1. #include
    2. #include
    3. using namespace std;
    4. void print(const mapint>& mp)
    5. {
    6. for (mapint>::const_iterator it = mp.begin(); it != mp.end(); it++)
    7. {
    8. cout << "姓名:" << it->first << ",年龄:" << it->second << endl;
    9. }
    10. }
    11. int main()
    12. {
    13. // STL - map - 常用接囗
    14. /*函数原型
    15. 构造函数
    16. 1、map mp;     //map默认构造函数
    17. 2、map(const map &mp); //拷贝构造函数
    18. 赋值
    19. 3、map& operator=(const map& mp);  //重载运算符=
    20. 大小
    21. 4、size();   //返回容器中元素个数
    22. 5、emppy();  //判断容器是否为空
    23. 交换
    24. 6、swap(st); //交换两个map容器
    25. 插入
    26. 7、insert(elem);//在容器中插入元素
    27. 删除
    28. 8、erase(key);    //删除容器中key元素
    29. 9、erase(pos);    //删除pos迭代器所指的元素,返回下一个元素的迭代器
    30. 10、erase(beg, end); //删除区间[beg, end) 的所有元素, 返回下一个元素的迭代器
    31. 11、clear();         //清除所有元素
    32. 查找
    33. 12、find(key);  //查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回map.end()
    34. 统计
    35. 13、count(key);  //统计key的元素个数
    36. */
    37. //1、map mp;     //map默认构造函数
    38. mapint> mp;
    39. //5、emppy();  //判断容器是否为空
    40. if (mp.empty())
    41. {
    42. //7、insert(elem);//在容器中插入元素
    43. //插入方式一
    44. mp.insert(pairint>("Tracy", 20));
    45. //插入方式二
    46. mp.insert(make_pair("Felix", 27));
    47. //插入方式三
    48. mp.insert(mapint>::value_type("Polly", 36));
    49. //插入方式四
    50. mp["Linda"] = 26;
    51. }
    52. //4、size();   //返回容器中元素个数
    53. cout << "---- 4、mp容器中元素个数:" << mp.size() << endl;
    54. cout << "---- 7、插入数据后mp,容器中元素:---" << endl;
    55. print(mp);
    56. //2、map(const map &mp); //拷贝构造函数
    57. mapint> mp2(mp);
    58. cout << "---- 2、拷贝构造函数mp2元素:----" << endl;
    59. print(mp2);
    60. //3、map& operator=(const map& mp);  //重载运算符=
    61. mapint> mp3 = mp;
    62. cout << "---- 3、重载运算符=mp3元素:----" << endl;
    63. print(mp3);
    64. //12、find(key);  //查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回map.end()
    65. mapint>::iterator pos = mp.find("Tracy");
    66. if (pos != mp.end())
    67. {
    68. cout << "---- 12、mp容器中查找到键 = " << (*pos).first << ", 值 = " << (*pos).second << endl;
    69. }
    70. //13、count(key);  //统计key的元素个数
    71. //map不允许插入重复key元素,count统计结果 只有 0 或 1
    72. cout << "---- 13、mp容器中统计键的元素个数 " << mp.count("Tracy") << endl;
    73. //6、swap(st); //交换两个map容器
    74. cout << "---- 6、交换前mp元素:----" << endl;
    75. print(mp);
    76. mp3.insert(pairint>("Timo ", 29));
    77. mp3.insert(pairint>("Alice", 32));
    78. mp3.insert(pairint>("Yolim", 17));
    79. cout << "---- 6、交换前mp3元素:----" << endl;
    80. print(mp3);
    81. mp.swap(mp3);
    82. cout << "---- 6、交换后mp元素:----" << endl;
    83. print(mp);
    84. cout << "---- 6、交换后mp3元素:----" << endl;
    85. print(mp3);
    86. //8、erase(key);    //删除容器中key元素
    87. mp.erase("Yolim");
    88. cout << "---- 8、删除key元素后,mp元素:----" << endl;
    89. print(mp);
    90. //9、erase(pos);    //删除pos迭代器所指的元素,返回下一个元素的迭代器
    91. mp.erase(mp.begin());
    92. cout << "---- 9、删除指定的第一个元素后,mp元素:----" << endl;
    93. print(mp);
    94. //10、erase(beg, end); //删除区间[beg, end) 的所有元素, 返回下一个元素的迭代器
    95. pos = mp.begin();
    96. pos++;
    97. mp.erase(pos, mp.end());
    98. cout << "---- 10、删除指定区间元素后,mp元素:----" << endl;
    99. print(mp);
    100. //11、clear();         //清除所有元素
    101. mp.clear();
    102. cout << "---- 11、清除所有元素后,mp元素:----" << endl;
    103. print(mp);
    104. system("pause");
    105. return 0;
    106. }

    输出结果

    ---- 4、mp容器中元素个数:4
    ---- 7、插入数据后mp,容器中元素:---
    姓名:Felix,年龄:27
    姓名:Linda,年龄:26
    姓名:Polly,年龄:36
    姓名:Tracy,年龄:20
    ---- 2、拷贝构造函数mp2元素:----
    姓名:Felix,年龄:27
    姓名:Linda,年龄:26
    姓名:Polly,年龄:36
    姓名:Tracy,年龄:20
    ---- 3、重载运算符=mp3元素:----
    姓名:Felix,年龄:27
    姓名:Linda,年龄:26
    姓名:Polly,年龄:36
    姓名:Tracy,年龄:20
    ---- 12、mp容器中查找到键 = Tracy, 值 = 20
    ---- 13、mp容器中统计键的元素个数 1
    ---- 6、交换前mp元素:----
    姓名:Felix,年龄:27
    姓名:Linda,年龄:26
    姓名:Polly,年龄:36
    姓名:Tracy,年龄:20
    ---- 6、交换前mp3元素:----
    姓名:Alice,年龄:32
    姓名:Felix,年龄:27
    姓名:Linda,年龄:26
    姓名:Polly,年龄:36
    姓名:Timo ,年龄:29
    姓名:Tracy,年龄:20
    姓名:Yolim,年龄:17
    ---- 6、交换后mp元素:----
    姓名:Alice,年龄:32
    姓名:Felix,年龄:27
    姓名:Linda,年龄:26
    姓名:Polly,年龄:36
    姓名:Timo ,年龄:29
    姓名:Tracy,年龄:20
    姓名:Yolim,年龄:17
    ---- 6、交换后mp3元素:----
    姓名:Felix,年龄:27
    姓名:Linda,年龄:26
    姓名:Polly,年龄:36
    姓名:Tracy,年龄:20
    ---- 8、删除key元素后,mp元素:----
    姓名:Alice,年龄:32
    姓名:Felix,年龄:27
    姓名:Linda,年龄:26
    姓名:Polly,年龄:36
    姓名:Timo ,年龄:29
    姓名:Tracy,年龄:20
    ---- 9、删除指定的第一个元素后,mp元素:----
    姓名:Felix,年龄:27
    姓名:Linda,年龄:26
    姓名:Polly,年龄:36
    姓名:Timo ,年龄:29
    姓名:Tracy,年龄:20
    ---- 10、删除指定区间元素后,mp元素:----
    姓名:Felix,年龄:27
    ---- 11、清除所有元素后,mp元素:---- 

    1.2、map排序

    map根据键值自动排序,默认排序规则为升序,可以利用仿函数实现降序排序。

    1. #include
    2. #include
    3. using namespace std;
    4. void print(const mapint>& mp)
    5. {
    6. for (mapint>::const_iterator it = mp.begin(); it != mp.end(); it++)
    7. {
    8. cout << "姓名:" << it->first << ",年龄:" << it->second << endl;
    9. }
    10. }
    11. class MyCompare
    12. {
    13. public:
    14. //仿函数
    15. bool operator()(string v1, string v2) const
    16. {
    17. return v1 > v2;
    18. }
    19. };
    20. //打印降序排序的容器元素
    21. void printDescending(const mapint, MyCompare>& mp)
    22. {
    23. for (mapint, MyCompare>::const_iterator it = mp.begin(); it != mp.end(); it++)
    24. {
    25. cout << "姓名:" << it->first << ",年龄:" << it->second << endl;
    26. }
    27. }
    28. int main()
    29. {
    30. // STL - map - 排序
    31. /*
    32. map根据键值自动排序,默认排序规则为升序,可以利用仿函数实现降序排序。
    33. */
    34. //map根据键值自动排序,默认排序规则为升序
    35. mapint> mp;
    36. mp.insert(make_pair("Tracy", 29));
    37. mp.insert(make_pair("Felix", 27));
    38. mp.insert(make_pair("Timo ", 16));
    39. mp.insert(make_pair("Alice", 27));
    40. cout << "---- map 默认排序规则为升序 ----" << endl;
    41. print(mp);
    42. //利用仿函数实现降序排序
    43. mapint, MyCompare> mp2;
    44. mp2.insert(make_pair("Tracy", 29));
    45. mp2.insert(make_pair("Felix", 27));
    46. mp2.insert(make_pair("Timo ", 16));
    47. mp2.insert(make_pair("Alice", 27));
    48. cout << "---- map 利用仿函数实现降序排序 ----" << endl;
    49. printDescending(mp2);
    50. system("pause");
    51. return 0;
    52. }

    输出结果

    ---- map 默认排序规则为升序 ----
    姓名:Alice,年龄:27
    姓名:Felix,年龄:27
    姓名:Timo ,年龄:16
    姓名:Tracy,年龄:29
    ---- map 利用仿函数实现降序排序 ----
    姓名:Tracy,年龄:29
    姓名:Timo ,年龄:16
    姓名:Felix,年龄:27
    姓名:Alice,年龄:27

  • 相关阅读:
    string类基本使用
    flutter系列之:builder为构造器而生
    jmeter 学习笔记
    嵌入式开发学习--进程、线程
    JavaScript:二进制数组【笔记】
    记某同事的两次误操作导致Linux瘫痪
    高薪程序员&面试题精讲系列139之你熟悉分布式事务吗--上篇?有哪些分布式事务实现方案?
    冷知识:SSD或U盘或FLASH闪存要温度高通电使用,温度低断电保存,数据才能更久不丢失!
    Hadoop学习全程记录——hive入门
    Ubuntu使用过程中的常见问题及解决方案
  • 原文地址:https://blog.csdn.net/ling1998/article/details/126134821