STL容器之map容器

STL-map

Posted by Zhihao on 2020-11-26

The First Title Picture

基础

简介:

  • map中所有元素都是pair。

  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。

  • 所有元素都会根据元素的键值自动排序。

本质:

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

优点:

可以根据key值快速找到value值。

map和multimap区别

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

multimap允许容器中有重复key值元素。

代码

Talk is cheap, show me the code.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#include<iostream>
using namespace std;
#include<map>

void printMap(const map<int, int>& mm)
{
for (map<int, int>::const_iterator it = mm.begin(); it != mm.end(); it++)
{
cout << "Key is: " << (*it).first << "Value is: " << (*it).second << endl;
}
}



/*
构造:
map<T1, T2> mp; //map默认构造函数:
map(const map &mp); //拷贝构造函数
赋值:
map& operator=(const map &mp); //重载等号操作符
*/

void test01()
{
map<int, int> mp;
mp.insert(pair<int, int>(1, 10));
mp.insert(pair<int, int>(2, 20));
mp.insert(pair<int, int>(3, 30));
mp.insert(pair<int, int>(4, 40));

printMap(mp);

map<int, int> mp2(mp);
printMap(mp2);

map<int, int> mp3;
mp3 = mp2;
printMap(mp3);
}


/*
大小和交换函数原型:
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
*/

void test02()
{
map<int, int> mp;
mp.insert(pair<int, int>(1, 10));
mp.insert(pair<int, int>(2, 20));
mp.insert(pair<int, int>(3, 30));
mp.insert(pair<int, int>(4, 40));

printMap(mp);

if (mp.empty())
{
cout << "Empty!" << endl;
}
else
{
cout << mp.size() << endl;
}

map<int, int> mp2;
mp2.insert(pair<int, int>(5, 50));
cout << "Swap Before: " << endl;
printMap(mp);
printMap(mp2);
cout << "Swap After: " << endl;
mp.swap(mp2);
printMap(mp);
printMap(mp2);
}


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

void test03()
{
map<int, int> mp;
mp.insert(pair<int, int>(1, 10));
mp.insert(pair<int, int>(2, 20));
mp.insert(pair<int, int>(3, 30));
mp.insert(pair<int, int>(4, 40));
printMap(mp);

map<int, int>::iterator it = mp.begin();
mp.erase(it);
printMap(mp);

mp.erase(3);
printMap(mp);

mp.erase(mp.begin(), mp.end());
printMap(mp);
}

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

void test04()
{
map<int, int> mp;
mp.insert(pair<int, int>(1, 10));
mp.insert(pair<int, int>(2, 20));
mp.insert(pair<int, int>(3, 30));
mp.insert(pair<int, int>(4, 40));
printMap(mp);

if (mp.find(3)!=mp.end())
{
cout << "Exists: " << (*mp.find(3)).second << endl;
}
else
{
cout << "Not Exists" << endl;
}

int num = mp.count(3);
cout << num << endl;
}

/*
map容器排序:
利用仿函数,可以改变排序规则
*/
class myCompare
{
public:
bool operator()(int val1,int val2)const //这里需要加const
{
return val1 > val2;
}
};

void test05()
{
map<int, int,myCompare> mp;
mp.insert(pair<int, int>(1, 10));
mp.insert(pair<int, int>(2, 20));
mp.insert(pair<int, int>(3, 30));
mp.insert(pair<int, int>(4, 40));

for (map<int, int,myCompare>::const_iterator it = mp.begin(); it != mp.end(); it++)
{
cout << "Key is: " << (*it).first << "Value is: " << (*it).second << endl;
}


}


int main()
{
test01();
test02();
test03();
test04();
test05();
system("pause");
return 0;
}

...

...

00:00
00:00