C++stl map 超详细解说!!!

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是一个指向具有给定关键字元素的迭代器secondbool值。

//对于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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值