您的位置:首页 > 其它

第11章-关联容器

2014-12-17 14:32 134 查看

关联容器

关联容器类型
map关联数组:保存关键字-值对
set关键字即值,即只保存关键字的容器
multimap关键字可以重复出现的map
multiset关键字可以重复出现的set
unordered_map用哈希函数组织的map
unordered_set用哈希函数组织的set
unordered_multimap哈希组织的map:关键字可以重复出现
unordered_multiset哈希组织的set:关键字可以重复出现


1 使用关联容器


2 关联容器概述

关联容器不支持顺序容器的位置相关的操作,例如push_front或push_back。原因是关联容器中元素是根据关键字存储的,这些操作对关联容器没有意义。而且,关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作。
关联容器的迭代器都是双向的。

2-1 定义关联容器

2-2 关键字类型的要求

对于有序容器-map、multima、set以及multiset,关键字类型必须定义元素比较的方法。默认情况下,标准库使用关键字类型的<运算符来比较两个关键字。
用来组织一个容器中元素的操作的类型也是该容器的一部分。为了指定使用自定义的操作,必须在定义关联容器类型时提供此操作的类型(比较操作类型应该是一种函数指针类型)。

2-3 pair类型

map的元素是pair类型的。


3 关联容器操作

关联容器额外类型别名
key_type容器类型的关键字类型
mapped_type每个关键字关联值的类型,只适用map
value_type对于set,就是key_type;对于map,为pair<const key_type, mapped_type>

3-1 关联容器迭代器

当适用一个迭代器遍历一个map、multimap、set或multiset时,迭代器按关键字升序遍历元素。
我们通常不对关联容器适用泛型算法。在实际编程中,如果真要对一个关联容器适用算法,要么将它当做一个源序列,要么当做一个目的位置。

3-2 添加元素

insert(或emplace)返回的值依赖容器类型和参数。
对于不包含重复关键字的容器,添加单一元素的insert或emplace版本返回一个pair。pair的first成员是一个迭代器,指向具有关键字的元素;second成员是一个bool值,指出元素是插入成功还是已经存在于容器中。如果关键字已经在容器中,插入操作什么也不做,second成员为false;如果关键字不存在,元素被插入容器中,second值为true。
对允许重复关键字的容器,接受单个元素的插入操作返回一个指向新元素的迭代器。

3-3 删除元素

关联容器提供一个额外的erase操作,它接受一个key_type参数。此版本删除所有匹配给定关键字的元素(如果存在的话),返回实际删除的元素数量。

3-4 map的下标操作

map和unordered_map容器提供了下标运算符和一个对应的at函数。
set不支持下标和at,因为set中没有与关键字相关联的“值”。
multimap不支持下标和at,因为它可能有多个值与一个关键字相关联。
类似其他下标运算符,map下标运算符或at接受一个索引(即一个关键字),获取与此关键字相关联的值。但是,不同的是,如果关键字不在map中,会为它创建一个元素并插入map中,关联值将进行值初始化。
由于下标运算符和at可能插入一个新元素,所以只可以对非const的map使用此操作。
通常情况下,解引用给一个迭代器返回的类型与下标运算符返回的类型是一样的。但是map来说:对一个map进行下标运算,会获得一个mapped_type对象;但当解引用一个map迭代器时,会得到一个value_type对象。

3-5 访问元素

如果一个multimap或multiset中有多个元素具有给定的关键字,那么这些元素在容器中会相邻存储。

3-6 一个单词转换的map


4 无序容器

C++11新标准定义了4个无序关联容器。它们不是使用比较运算符来组织元素,而是使用一个哈希函数和关键字类型的==运算符。
无序容器在存储上组织为一组桶,每个桶保存零个或多个元素。无序容器使用一个哈希函数将元素映射到桶。
默认情况下,无序容器使用关键字类型的==运算符来比较元素,它们还使用一个has<key_type>类型的对象来生成每个元素的哈希值。标准库为内置类型(包括指针)提供了hash模板,还未一些标准库类型,包括string和智能指针类型定义了hash。
我们不能直接定义关键字类型为自定义类类型的无序容器,而需要提供函数来替代==运算符和哈希值计算函数(当然,需要函数指针类型)。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: