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