第10章 关联容器

本文详细介绍了C++标准模板库中的Map容器,包括构造函数、插入、查询和删除操作等核心功能。并通过示例展示了如何使用下标进行元素的插入与访问。

第10章 关联容器

1、map的构造函数

map<k,v> m;              创建一个名为m的空map对象,其健和值得类型分别为k和v。

map<k, v> m(m2)      创建m2的副本m,m与m2必须有相同的健类型和值类型。

map<k, v> m(b, e)      创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转换为pair<const k, v>

2、 map<string, int> word_count;

//insert default initialzed element with key Anna;then assign 1 to this value.

Word_count[“Anna”] = 1;

将发生以下事情:

(1)   在word_count中查找健为Anna的元素,没有找到。

(2)   将一个新的健-值对插入到word_count中。它的健是const string 类型的对象,保存Anna。而它的值则采用值初始化,这就意味着在本例中值为0.

(3)   将这个新的健-值对插入到word_count中。

(4)   读取新插入的元素,并将它的值赋为1.

3、 使用下标访问map与使用下标访问数组或vector的行为截然不同;用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的健即为该下标值。此时,所关联的值采用值初始化,类类型的元素用默认构造函数初始化,而内置类型的元素则初始化为0.

4、map容器提供的insert操作

m.insert(e)                  e是一个用在m上的value_type类型的值。如果健(e.first)不在m中,则插入一个值为e.second的新元素;如果该健在m中已存在,则保持m不变。该函数返回一个pair类型对象,包含指向健为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素。


m.insert(beg,end)      beg和end是标记元素范围的迭代器,其中的元素必须为m.value_type类型的健-值对。对于该范围内的所有元素,如果它的健及其关联的值插入到m。返回void类型。


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

5、不修改map对象的查询操作:

       m.count(k)返回m中k的出现次数

       m.find(k)      如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器

6、从map对象中删除元素

       m.erase(k)           删除m中健为k的元素。返回size_type类型的值,表示删除的元素个数。

       m.erase(p)          从m中删除迭代器p所指向的元素。P必须指向m中确实存在的元素,而且不能等于m.end()。返回void类型。

       m.erase(b,e)              从m中删除一段范围内的元素,该范围由迭代器对b和e标记,b和e必须标记m中的一段有效范围:即b和e都必须指向m中的元素或最后一个元素的下一个位置,而且,b和e必须标记m中的一段有效范围:即b和e都必须指向m中的元素或最后一个元素的下一个位置 。而且,b和e要么相等(此时删除的范围为空),要么b所指向的元素必须出现在e所指向的元素之前,返回void类型。

7、set不支持下标操作符,而且没有定义mapped_tpye类型。

8、为了通过健从set中获取元素,可使用find运算。如果只需简单地判断某个元素是否存在,同样可以使用count运算,返回set中该健对应的元素个数。

9、multimap和multiset类型与相应的单元素版本具有相同的头文件定义:分别是map和set头文件。

10、  multimap和multiset所支持的操作分别与map和set的操作相同,只有一个例外,multimap不支持下标运算。

11、 在multimap和multiset容器中,如果某个键对应多个实例,则这些实例在容器中将相邻存放。

12、与众不同的面向迭代器的解决方案:

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

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

m.equal_range(k)              返回一个迭代器的pair对象。

        它的first成员等价于m.lower_bound(k)。而second成员则等价于m.upper_bound(k)

13、Lower_bound返回的迭代器不一定指向拥有特定健的元素。如果该健不在容器中,则lower_bound返回在保持容器元素顺序的前提下该健应被插入的第一个位置。

14、equal_range函数,来取代调用upper_bound和lower_bound函数。equal_range函数返回存储一对迭代器的pair对象,如果该值存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一个位置。如果找不到匹配的元素,则pair对象中的两个迭代器都将指向此键应该插入的位置。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值