《C++primer》关联容器

来源:互联网 发布:玻璃杯加工工艺知乎 编辑:程序博客网 时间:2024/05/02 01:42

关联容器(associative container)支持通过键来高效地查找和读取元素。主要有map和set类型。map的元素以键-值对的形式组织,而set仅包含一个键

map关联数组,元素通过键来存储和读取set大小可变的集合,支持通过键实现的快速读取multimap支持同一个键多次出现的map类型multiset支持同一个键多次出现的set类型标准库类型pair在头文件utility中定义。pair是一种模板类型,包含两个数据值。

在创建pair对象时,必须提供两个类型名,pair对象所包含的两个数据成员各自对应的类型名字,这两个类型不必相同。

pair类型的数据成员可以直接访问,其成员分别命名为first和second

关联容器共享大部分(并非全部)的顺序容器操作。关联容器不提供front,push_front,pop_front,back,push_back以及pop_back操作。

键的比较函数“<",必须严格弱排序。所谓严格弱排序就是键类型数据上的“小于”关系,不能出现相互“小于”。如果相互不“小于”则是相等。

map对象的元素是键-值对,map的value_type就反映了这个事实。

map<K,V>::value_type,一个pair类型,它的first元素具有const map<K,V>::key_type类型,而second元素则为map<K,V>::mapped_type类型。

map迭代器进行解引用将产生pair类型的对象。

使用下标访问map与使用下标访问数组或vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。

map容器的insert成员与顺序容器的类似,但需要考虑键的影响。

map对象中一个给定键只对应一个元素。如果试图插入的元素所对应的键已在容器中,则insert不做任何操作。

map容器提供了两个操作:count和find,用来检查某个键是否存在而不会插入该键

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

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

erase操作可以从map对象中删除元素

关联容器的键都是唯一的,而且不能修改。

set容器是键的集合。当只想知道一个值是否存在时,使用set容器是最合适的。

set容器不提供下标操作符。

关联容器是按顺序存储的。

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

1.使用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.upper_bound(k)

3.equal_range函数返回存储一堆迭代器的pair对象