C++关联容器之map

1.map简介

  map中的元素是关键字-值对:关键字起到索引的做用,值表示与索引相关的数据。咱们经常使用的字典就是很好的map的实例,单词做为索引,其中文含义表明其值。map类型一般被称为关联数组,其和数组很类似,只不过其下标不是整数而是关键算法

,咱们经过关键字来查找值而不是位置。好比电话簿也是一个map的例子,姓名做为关键字其对应的值就为该人的电话号码。map类型定义在头文件map中数组

注意:map是有序的且不容许重复关键字的关联容器!其有序的实现是依靠关键字类型中的"<"来实现的。app

 

2.map的定义与初始化

  2.1 建立空map

map<key_type,value_type> tempMap;//建立空map

  2.2 列表初始化map

map<key_type,value_type> tempMap{
  {key1,value1},
  {key2,value2},
  ......};

  2.3 使用已有的map复制构造

map<key_type,value_type> tempMap(existMap);//注意关键字类型与值类型匹配

   2.4  指定已有map的迭代器返回进行构造

map<key_type,value_type> tempMap(b,e);//b,e为已有map对象的迭代器范围

 

3.map的赋值操做

  咱们能够将一个已有的map赋值给另外一个map:函数

map1=map2;

map也支持列表赋值:spa

map<key_type,value_type> tempMap={   {key1,value1},   {key2,value2},   ......};

 

4.关联容器额外的类型别名

  除了以前的容器操做具备的类型,map有本身独特的类型别名:code

类型别名

说明对象

key_typeblog

关键字类型

 mapped_type索引

关键字关联的类型

 value_type编译器

pair<const key_type,mapped_type>

举例

map<int ,string> myMap; myMap::value_type v1;//v1为pair<const int ,string>类型
myMap::key_type v2;//v2为int类型
myMap::mapped_type v3;//v3为string类型

 

5. 新的数据类型  pair类型

  pair标准类型定义在头文件utility中,一个pair保存两个数据成员,pair是用来生成特定类型的模板,当建立一个pair对象时必需要提供两个类型名

pair<string string> A;//保存两个string
pair<string ,size_t> B;//保存一个string,一个size_t
pair<int ,vector<int>> C;//保存一个int和vector<int>

上面的代码都是执行了默认构造函数来对数据成员进行初始化,咱们也能够初始化器:

pair<string,string> thePair{"Hello","World"};

pair的数据成员是public的,而且成员命名为first和second,咱们能够使用普通的成员访问符“.”来进行访问。

  咱们能够在pair上的操做以下:

操做 

说明

pair<T1,T2> P;

p的成员数据类型分别为T1,T2,并执行默认初始化

pair<T1,T2> p(v1,v2);

P的成员数据类型分别为T1,T2,而且使用v1,v2分别初始化

pair<T1,T2> p={v1,v2};

等价于上式

make_pair(v1,v2);

返回一个v1和v2初始化的pair,其类型由v1和v2推断而来

p.first

返回p的first成员

 p.second

返回p的second成员

 p1 relop p2

执行关系运算(>,<,<=,>=),利用数据类型中的关系运算

 p1==p2

相等性判断,必须first和second同时知足要求

p1!=p2 

不等于判断

 

5.1 建立使用pair对象的函数

pair<int ,string> do_something(vecotr<string> &v) { if(!v.empty()) { return {v.back().size(),v.back()}; } else { return pair<int ,string>(); } }

有些较早版本的编译器不支持花括号返回,那咱们能够先构造pair对象再返回

pair<int ,string> do_something(vecotr<string> &v) { if(!v.empty()) { return pair<int ,string>(v.back().size(),v.back());//也可以使用make_pair来生成pair对象
   }
else { return pair<int ,string>(); } }

 

6.map的迭代器

  当咱们对map的迭代器进行解引用的时候咱们获得的是value_type类型,也就是一个pair类型,要注意的是其first成员是const的,second成员是很是量成员,很明显咱们不能改变map关键字,但咱们能够改变关键字所关联的值,咱们能够使用迭代器来遍历咱们的map对象

auto map_iter=myMap.cbegin(); while(map_iter!=myMap.cend()) { cout<<"key: "<<map_iter->first<<"value: "<<map_iter->second<<endl; ++map_iter; } 

  注意:因为map中的关键字是const,咱们通常不对map使用泛型算法!

 

7.向map添加元素

  咱们使用insert对map进行元素添加操做,咱们必需要记住的一点就是map的元素是pair类型的,下面列举经常使用的insert方法:

myMap.insert({k1,v1}); myMap.insert(make_pair(k2,v2)); myMap.insert(pair<key_type,value_type>(k3,v3)); myMap.insert(map<key_type,value_type>::value_type(k4,v4));

下面列举其余的一些添加元素的方式:

操做

说明

c.insert(v)

v为value_type对象,返回一个pair包含一个迭代器和是否成功插入的bool值,关键词不存在才插入

c.emplace(args)

args用来构造元素,返回一个pair包含一个迭代器和是否成功插入的bool值,关键词不在才插入

c.insert(b,e)

b和e是迭代器,指定多个元素插入,返回void

c.insert(il)  

il花括号列表形式,返回void

c.insert(p.v)

和insert(v)相似,p是迭代器,指定从哪里开始搜索新元素应该存储的位置,返回值为一个迭代器,指出具备给定关键字的元素

c.emplace(p,args)

和c.emplace(args)相似,p是迭代器,指定从哪里开始搜索新元素应该存储的位置,返回值为一个迭代器,指出具备给定关键字的元素

 7.1 检测insert的返回值

   添加单一元素的insert和emplace返回值一个pair,告诉咱们插入是否成功,pair的first是一个迭代器,指向具备给定关键字的元素,second是一个bool型,若是插入成功为true,不然为false。若是关键字已经在map中那么insert和emplace什么也不作。

 

8.删除元素

  使用erase函数来执行map的删除操做:

操做

说明

c.erase(k)

删除c中关键词为k的元素,返回值为size_type类型,指出删除元素的数目,由于map中不容许重复,返回值为0或者1

c.erase(p)

从c中删除迭代器p指定的元素,p必须指向一个真实存在的元素,返回值指向p以后元素的迭代器,若是p指向c的微元素,那么将返回c.end()

 c.erase(b,e)

删除迭代器对b和e所表示返回的元素,返回值迭代器e 

 

9. map的下标操做

  map提供了下标操做和at函数操做。咱们对map使用下标操做要注意下标是关键字,还要注意的是对不存在map中的关键字使用了下标操做,会添加一个具备该关键字的元素到map中。

操做

说明

c[k]

返回关键字为k的元素,若是k不在c中,添加一个关键字为k的元素,对其进行初始化

c.at(k)

访问关键字为k的元素,带参数检查,若是k不在c中,则返回out_of_range异常

9.1使用下标操做的返回值

   当咱们对一个map进行下标操做的时候,会得到mapped_type对象,但当解引用map的迭代器时,会获得一个value_type对象,若是关键字不存在map中,下标运算依然会添加一个具备该关键字的新元素。在咱们不肯定一个元素是否在map中,且不想在map中进行添加就不能使用下标操做。

 

10.访问元素

  当咱们要肯定一个元素是否存在map中,使用find是最佳的选择,对于不容许重复关键字的map来讲,使用count函数返回的关键字计数只能为0和1。对于map元素的访问还有以下的操做:

操做  

说明

c.find(k)

返回一个迭代器,指向第一个关键字为k的元素,若是不在map中,则返回尾后迭代器c.end()

c.count(k)

返回关键字等于k的元素数量,对于map返回值只能为0和1

c.lower_bound(k)

返回一个迭代器,指向第一个关键字不小于k的元素

c.upper_bound(k)

返回一个迭代器,指向第一个关键字大于k的元素

c.equal_range(k)

返回一个迭代器pair,表示关键字等于k元素的范围,若是k不存在,则pair的数据成员全是c.end()

备注:若是使用lower_bound和upper_bound匹配关键字k,返回了相同的迭代器,那么关键字k不在map中。

相关文章
相关标签/搜索