map的定义
单独定义一个map:
map<typename1, typename2> mp;
如果是字符串到整型的映射,必须使用string而不能使用char数组:
map<string, int> mp;
这是因为char数组作为数组,是不能被作为键值的。
map容器内元素的访问
- 通过下标访问
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
map<char, int> mp;
mp['c'] = 20;
mp['c'] = 30; // 20被覆盖
printf("%d\n", mp['c']); // 输出30
return 0;
}
- 通过迭代器访问
map<typename1, typename2>::iterator it;
typename1和typename2就是定义map时填写的类型,这样就得到了迭代器it。
map可通过使用it->first来访问键,使用it->second来访问值。
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
map<char, int> mp;
mp['m'] = 20;
mp['r'] = 30;
mp['a'] = 40;
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++)
{
printf("%c %d\n", it->first, it->second);
}
return 0;
}
输出为:
a 40
m 20
r 30
这里有一个有趣的现象:map会以键从小到大的顺序自动排序。这是由于map内部是使用红黑树实现的,在建立映射的过程中会自动实现从小到大的排序功能。
map常用函数实现
- find()
find(key)返回键为key的映射的迭代器。
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp<char, int>::iterator it = mp.find('b');
printf("%c %d", it->first, it->second);
return 0;
}
输出结果:
b 2
- erase()
- 删除单个元素
mp.erase(it),it为需要删除的元素的迭代器。
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
map<char, int>::iterator it = mp.find('b')
mp.erase(it);
for(map<char, int>::iterator it = mp.begin(); it!=mp.end(); it++)
{
printf("%c %d", it->first, it->second);
}
return 0;
}
输出内容:
a 1
c 3
- mp.erase(key),key为欲删除的映射的键。
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp.erase('b'); //删除键为b的映射,即b 2
for(map<char, int>::iterator it = mp.begin(); it!=mp.end(); it++)
{
printf("%c %d\n", it->first, it->second);
}
return 0;
}
输出内容如下:
a 1
c 3
- 删除一个区间内的所有元素
mp.erase(first, last),其中first为需要删除的区间内的起始迭代器,而last则为需要删除的区间内的末尾迭代器的下一个地址,也即为删除左闭右开的区间[first, last)。
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
map<char, int>::iterator it = mp.find('b'); //令it指向键为b的映射
mp.erase(it, mp.end()); //删除it之后的所有映射,即b 2和c 3
for(map<char, int>::iterator it = mp.begin(); it!=mp.end; it++)
{
printf("%c %d", it->first, it->second);
}
return 0;
}
输出结果:
a 1
- size()
size()用来获得map中映射的对数。
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
map<char, int> mp;
mp['a'] = 10;
mp['b'] = 20;
mp['c'] = 30;
printf("%d\n", mp.size()); //3对映射
return 0;
}
输出结果:
3
- clear()
clear()用来清空map中的所有元素。
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp.clear(); //清空mp
printf("%d\n", mp.size());
return 0;
}