STL之map容器和multimap容器

蔚落 2023-10-11 13:31 25阅读 0赞

摘要:本文主要介绍了map容器和multimap容器的相关内容。

1、基本概念

1.1 Map的特性

所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。

1.1 map容器的键值无法修改

map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。

Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。

1.2 Multimap容器

Multimap和map的操作类似,唯一区别multimap键值可重复。

Map和multimap都是以红黑树为底层实现机制。

2、常用的API































































































  API 意义
构造函数

    map<T1, T2> mapTT

map默认构造函数
map(const map &mp) 拷贝构造函数
赋值操作

map& operator=(const map &mp)

重载等号操作符
swap(mp) 交换两个集合容器
大小操作

size()

返回容器中元素的数目
empty() 判断容器是否为空
插入数据元素操作

map.insert(…); //往容器插入元素,返回pair<iterator,bool>

map<int, string> mapStu;

往容器插入元素,返回pair<iterator,bool> map<int, string> mapStu;

第一种 通过pair的方式插入对象

mapStu.insert(pair<int, string>(3, “小张”));

第二种 通过pair的方式插入对象

mapStu.inset(make_pair(-1, “校长”))
第三种 通过value_type的方式插入对象 mapStu.insert(map<int, string>::value_type(1, “小李”))
第四种 通过数组的方式插入值

mapStu[3] = “小刘”;mapStu[5] = “小王”;

删除操作

 

clear()

删除所有元素
erase(pos) 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end) 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器
erase(keyElem) 删除容器中key为keyElem的对组

查找操作

find(key)

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

返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap

来说,值可能大于1

lower_bound(keyElem) 返回第一个key>=keyElem元素的迭代器
upper_bound(keyElem) 返回第一个key>keyElem元素的迭代器
equal_range(keyElem) 返回容器中key与keyElem相等的上下限的两个迭代器

3、代码示例

  1. 1 #include <iostream>
  2. 2 #include<map>
  3. 3 #include <algorithm>
  4. 4
  5. 5 using namespace std;
  6. 6
  7. 7 void test01() {
  8. 8 map<int, int>m; //注意和其他容器相区分,一个是序号另外一个是键值
  9. 9 m.insert(pair<int,int>(1,10)); //这里运用四种方法给map容器插值
  10. 10 m.insert(make_pair(2,20));
  11. 11 m.insert(map<int,int>::value_type(3,30));
  12. 12 m[4] = 40;
  13. 13
  14. 14 for (map<int,int>::iterator it=m.begin();it!=m.end();it++)
  15. 15 {
  16. 16 cout << it->first << " " << (*it).second << endl;
  17. 17 }
  18. 18
  19. 19 if(m.empty())
  20. 20 {
  21. 21 cout << "空" << endl;
  22. 22 }
  23. 23 else
  24. 24 {
  25. 25 cout << "size = " << m.size() << endl;
  26. 26 }
  27. 27 }
  28. 28
  29. 29 void test02() {
  30. 30 map<int, int> m;
  31. 31 m.insert(pair<int, int>(1, 10));
  32. 32 m.insert(make_pair(2, 20));
  33. 33 m.insert(map<int, int>::value_type(3, 30));
  34. 34 m[4] = 40;
  35. 35
  36. 36 m.erase(1); //直接将第一个值删除
  37. 37 for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
  38. 38 {
  39. 39 cout << "key = " << it->first << " value" << it->second << endl;
  40. 40 }
  41. 41
  42. 42 map<int, int>::iterator pos = m.find(2); //查找
  43. 43 if (pos != m.end())
  44. 44 {
  45. 45 cout << "找到:key" << pos->first << " value:" << pos->second << endl;
  46. 46 }
  47. 47 else
  48. 48 {
  49. 49 cout << "未找到" << endl;
  50. 50 }
  51. 51
  52. 52 int num = m.count(3); //map的count 要么0 要么1
  53. 53 cout << "num = " << num << endl;
  54. 54
  55. 55 // lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
  56. 56
  57. 57 map<int, int>::iterator ret = m.lower_bound(3);
  58. 58 if (ret != m.end())
  59. 59 {
  60. 60 cout << "lower_bound 中key" << ret->first << " value: " << ret->second << endl;
  61. 61 }
  62. 62 else
  63. 63 {
  64. 64 cout << "未找到" << endl;
  65. 65 }
  66. 66
  67. 67 //upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
  68. 68 ret = m.upper_bound(3);
  69. 69 if (ret != m.end())
  70. 70 {
  71. 71 cout << "upper_bound 中key" << ret->first << " value: " << ret->second << endl;
  72. 72 }
  73. 73 else
  74. 74 {
  75. 75 cout << "未找到" << endl;
  76. 76 }
  77. 77
  78. 78 //equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
  79. 79
  80. 80 pair<map<int, int>::iterator, map<int, int>::iterator> ret2 = m.equal_range(3);
  81. 81
  82. 82 if (ret2.first != m.end())
  83. 83 {
  84. 84 cout << "找到了equal_range 中的lower_bound 的key " << ret2.first->first << " value: " << ret2.first->second << endl;
  85. 85 }
  86. 86 else
  87. 87 {
  88. 88 cout << "未找到" << endl;
  89. 89 }
  90. 90
  91. 91 if (ret2.second != m.end())
  92. 92 {
  93. 93 cout << "找到了equal_range 中的upper_bound 的key " << ret2.second->first << " value: " << ret2.second->second << endl;
  94. 94 }
  95. 95 else
  96. 96 {
  97. 97 cout << "未找到" << endl;
  98. 98 }
  99. 99 }
  100. 100 bool myCompare(int &v1, int &v2){
  101. 101 return v1 > v2;
  102. 102 }
  103. 103
  104. 104 int main() {
  105. 105 //test01();
  106. 106 test02();
  107. 107 system("pause");
  108. 108 return 0;
  109. 109 }

转载于:https://www.cnblogs.com/lzy820260594/p/11395449.html

发表评论

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

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

相关阅读

    相关 STL容器 -- map/multimap

    1、map/multimap容器基本概念 map的特性是,所有元素都会根据元素的键值自动排序。map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键