1.使用时要包含头文件 #include<map>,不要忘记了
2.基本介绍
格式:map<key, value>
key:键值 value:实值
map中的元素是一些关键字-值(key-value)对;
map容器通常被称为关联数组,但其下标不必为整数;
key与value相当于绑定在一起,每一个不同的key对应于一个value,因此map容器中元素总是成对出现,而key起到索引的作用,可以凭借它很方便的找到value的值。
所有元素都会根据元素的键值(key)自动排序。
当使用一个迭代器遍历map时,迭代器按关键字升序遍历元素。
举例:一个班的学生中,每个同学的学号不一样,学号即为key,而每个key对应着一个学生的名字,这个名字就是value。而老师通过学号可以很快找到对应的学生的名字,而且学号自动排序,在print出来的时候是按照学号顺序的而非乱序。
3.map与multimap的相同点与不同点
相同点:
map/multimap都属于关联式容器,底层结构用二叉树实现;
都定义在头文件map。
不同点:
map不允许有重复的key(可以有重复的value),multimap允许有重复的key(multimap是key可重复出现的map)。
重复的key重复实际上是指一个key可以与多个value相关联,这些元素(value)会在容器中相邻位子储存。
举例:在统计单词数量的map中每个单词只能有一个元素;但是在词典中,一个单词可能会有多个含义。
4.pair类型
pair是标准库类型,它定义在头文件utility中;
类似容器,pair是一个用来生成特定容器的模板;
一个pair保存两个数据成员,与其他标准库类型不同,pair的数据成员是public的,两个成员名分别为first,second;
map的元素是pair,不难想到,key对应first,value对应second。
标准库只定义了有限的几个pair 的操作:
5.关联容器操作
key_type是key的类型
mapped_type是value的类型
value_type是pair<,>类型
6.有关迭代器
//map迭代器解引用是一个指向pair< , >对象的引用,因此可以用 迭代器 -> (pair)的数据成员(first或second)来访问成员
//遍历map
这里用的cbegin()、cend()表明返回的是const_iterator。
补充知识:iterator、const_iterator都可以用来遍历map,但是iterator可以改变其指向的元素的值,const_iterator只能访问不能改变,但是const_iterator自己本身是可以改变的(向前移、向后移),只是指向的值不能改变。
7.map容器与算法
关联容器定义了一个名为find的成员,它通过一个给定的关键字直接获取元素。我们用泛型find算法来找一个元素,但此算法会进行顺序搜索。而使用关联容器定义的专用find成员会比调用泛型find快得多。
8.对map对象的操作
1.添加元素:
使用成员函数insert(向容器中添加一个元素或一个元素的范围);
插入一个已存在的元素对容器没有任何影响;
//几种insert()的方法
//检测insert的返回值
注意看对于map的insert函数的返回值返回的是一个pair,它的first是一个指向具有给定关键字元素的迭代器,second是bool值。
//对于multimap这样可以有重复key的容器,无须返回bool值,返回的是一个指向新元素的迭代器
2.删除元素
使用erase函数
如果传递给函数的是key,函数返回值就是删除元素的数量(如果是key不能重复的容器,如map,那么返回值不是1就是0,如果容器中原本有此key,就返回1;如果没有,返回的就是0;但像multimap这样key可以重复的容器,返回值可能会大于1)
如果传递给函数的是迭代器,返回的就是删除后在原先顺序下的位置的新的迭代器
3.map的下标操作
set类型不支持下标操作,因为其元素本身就是关键字;
multimap等也不支持,因为一个key可能对应多个value;
下标操作是通过key来访问value,格式:
m["guk"] ;
m[23] = "haha";
返回值类型:
map下标操作返回的就是key对应的那个value的类型
而解引用map迭代器(上面6.有关迭代器有详细说明)得到的是一个pair<,>
find与count
key重复容器怎么办?如下:
(C++Primer P390页还有另外两种方法)
9.map的有关函数总结
begin() | 返回指向map头部的迭代器 |
clear() | 删除所有元素 |
count() | 返回指定元素出现的次数 |
empty() | 如果map为空则返回true |
end() | 返回指向map末尾的迭代器 |
equal_range() | 返回特殊条目的迭代器对 |
erase() | 删除一个元素 |
find() | 查找一个元素 |
get_allocator() | 返回map的配置器 |
insert() | 插入元素 |
key_comp() | 返回比较元素key的函数 |
lower_bound() | 返回键值>=给定元素的第一个位置 |
max_size() | 返回可以容纳的最大元素个数 |
rbegin() | 返回一个指向map尾部的逆向迭代器 |
rend() | 返回一个指向map头部的逆向迭代器 |
size() | 返回map中元素的个数 |
swap() | 交换两个map |
upper_bound() | 返回键值>给定元素的第一个位置 |
value_comp() | 返回比较元素value的函数 |
(函数总结摘自cppreference.com)