C++学习笔记9——关联容器

关联容器最大的特点就是通过键(key)存储和读取元素

pair类型也是一种摸板类型,包含两个元素。pair<T1,T2> p1(V1,V2)分别初始化为类型T1、T2,p1.first,p1.second分别返回first/second的元素。被用作map容器的键

map是键-值对的集合,map中元素为pair。map<k,v> m(b,e)创建map类型的对象m,存储迭代器b到e之间所有元素的副本,建和值类型分别为k,v。 map<k,v> m;    map<k,v> m(m1)另两种构造函数。其中键值为const类型,不能改变

map定义的类型   map<k,v>::key_type 在map容器中,用作索引的键的类型      map<k,v>::mapped_type 在map容器中,键所关联的值的类型      map<k,v>::value_type一个pair类型。map类型的迭代器属于pair类型,对其解引用得到一个pair对象。

使用下标访问map对象:map <string,int> a;  a["aaaa"]=1;先在a中寻找键为aaaa的元素,没有找到,创建一个新的键-值对加入a中,key=aaaa,关联的值为0;将其添加到a中,读取新插入的元素,并将其值赋为1。若map对象存在,下标返回的是键所关联的值。

m.insert(e)  e是一个value_type类型的值。若e.first不在m中,添加这个新元素。若m键在m中已存在,则保持m不变。该函数返回一个pair类型对象,first便是一个指向e.first的迭代器,second返回bool值。若添加的元素不在容器中,bool为true

m.insert(beg,end)   beg,end是m.value_type类型的迭代器,若其范围内的所有元素的键在m中不存在,则加入,返回void

m.insert(iter,e)  e是m上的value_type类型的值。若e.first不在m,则创建,并以iter为起点搜索新元素储存的位置。返回一个指向m中具有给定键的元素

make_pair(a,b)可以直接创建一个pair类型    或者   typedef map<string,int>::value_type valtype;  valtype(a,b)就直接创建了pair

pair<map<string,int>::iterator,bool> ret=a.insert(make_pair(word,1));        分析++ret.first->second         当a中不含word时,返回值ret是pair型,ret.first是指向新加入的元素的迭代器,ret.second是bool=true;对ret.first解引用后成员first为新加入的元素的键值,second为其关联的值。(*(ret.first)).second和ret.first->second等同.

m.count(k) 返回m中k出现的次数        m.find(k)   如果m中存在按k索引的元素,则返回指向该元素的迭代器。若不存在,则返回超出末端迭代器end。可知count用来查找是否存在,find可用来读取。

从map对象中删除元素  e.erase(k)  删除m中键为k的元素,返回删除的元素个数。       e.erase(p)从m中删除迭代器p所指向的元素,这个元素必须存在,返回void

e.erase(b,e)      删除b,e间的元素  ,b所指向的元素必须在e所指向的元素之前,或者两者相等

set容器与map容器共享同样的构造函数 ,set中只存储键值。set.insert("a")返回一个迭代器和bool值的pair型对象     set.insert(a,b)  a,b为迭代器,返回void

set.find()同样返回一个指向键的迭代器,set.count()返回数值。键值为const型,不能发生改变。

multiset和multimap类型允许一个键对应多个实例,他们所支持的操作分别与set和map相对应,除了multimap不支持下标运算。而且对于某个键值,要做好出个多个值的准备

insert操作总是添加一个元素,而带有一个键参数的erase版本将删除拥有该键的所有元素,并返回删除元素的个数。而带有迭代器的版本只删除指定的元素,并返回void

同一个键对应的几个实例,在容器中相邻存放

在multiset和multimap中寻找元素的方法:

1、find和count并用     先用find返回指向第一个匹配的实例的迭代器,用count得到实例的总数,然后遍历

2、m.lower_bound(k)  返回一个迭代器,指向键不小于k的第一个元素。     m.upper_bound(k)  返回一个迭代器,指向键大于k的第一个元素

m.equal_range(k) 返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k)。second等价于m.lower_bound(k)

对同一个键进行操作,就能得到一个迭代器范围,恰好就是所有的实例所在的范围

3、equal_range()返回一对迭代器的pair对象,若存在,第一个迭代器指向该值关联的第一个实例,第二个迭代器指向最后一个实例的下一个位置。若找不到,则两个迭代器都指向插入位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值