关联容器map的使用
Posted zpchya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关联容器map的使用相关的知识,希望对你有一定的参考价值。
map容器中的元素是一些关键字-值(key-value)对。map全称为有序的关键字不可重复的map,可以称之为关联数组,map通过关键字而非位置来查找值。
出了map外,还有允许关键字重复的multimap、无序的(由哈希函数组织的)关键字不可重复出现的unordered_map和无序的关键字可重复出现的unordered_multimap。
1 map的定义和初始化
在定义和初始化上,map和顺序容器vector并没有很大区别,甚至大多数初始化方式是一样的。
2 赋值
map的赋值可以有同类型之间的赋值和初始值列表两种方式。
3 map容器大小的操作
容器大小操作上与vector一样,有empty()/size()/max_size()三个成员函数的操作。
4 迭代器
map容器的迭代器并不想vector容器那样支持多种多样的操作,它只支持所有标准库容器的通用操作:①*iter;②iter->;③++iter;④--iter;⑤iter1 == iter2;⑥iter1 != iter2。
1)关联容器中有三个类型别名,分别为关键字类型key_type、值类型mapped_type和键-值类型pair<const key_type, mapped_type>。对迭代器解引用时会得到value_type值的引用为pair<first, second>。
2)map的value_type是pair类型,它的first成员(关键字类型)是const类型的,不可更改,而second成员是可以修改的。
我们使用迭代器遍历map(包括有序关联容器)时,迭代器按关键字升序遍历元素。其begin()得到的迭代器也不是指向初始化列表中的第一个元素,而是按字典序排序后的第一个元素。
5 添加元素
容器map添加元素的操作有insert()和emplace(),emplace()和insert()的区别在上一篇vector容器的使用中提过。
1)insert(v) v是value_type类型的对象。只有当关键字在容器中不存在时才插入。函数返回一个pair对象,包含一个迭代器,指向插入关键字元素,和一个指示插入是否成功的bool。
2)insert(il) il是值的花括号列表,函数返回void。
3)insert(b, e) b、e是一对迭代器,函数返回void。
4)insert(p, v) 迭代器p作为从哪里开始搜索新元素应该存储位置的迭代器,v为插入元素,既可以是是value_type对象也可以是值的花括号列表。
6 删除元素
map删除元素的函数为erase(),它有三个版本,其中erase(p)、erase(b, e)函数的操作与顺序容器中的相似,p、b、e都为迭代器。关联容器有其特有的earse版本,erase(k)其中k为关键字类型,函数的功能是删除关键字为k的元素,返回size_t类型,指出删除元素的数量。
7 map的下标操作
map下表运算符接受一个关键字获取该关键字对应的值。与其他下表运算不同的是,如果关键字并不在map中,它会创建一个元素并插入到map中并对其关键字进行值初始化。
下表操作还有at(k)函数,但是当map中不存在k时at函数是抛出异常。
8 访问元素
除了上面的下表运算符和at()函数,map还有其他的访问元素的操作。
1)find(k) 返回指向第一个关键字为k的迭代器,若容器中不能存在k则返回尾后迭代器。
2)count(k) 返回关键字等于k的元素数量,对于map来说永远都是返回0或1。
3)lower_bound(k) 返回指向第一个关键字不小于k的元素的迭代器。
4)upper_bound(k) 返回指向第一个关键字大于k的元素的迭代器。
该篇博客是自己的学习博客,水平有限,如果有哪里理解不对的地方,希望大家可以指正!
以上是关于关联容器map的使用的主要内容,如果未能解决你的问题,请参考以下文章