引入
之前vector
、list
等所学的统称为序列式容器,其底层为线性序列的数据结构,里面存储的是元素本身。
而关联式容器也是用来存储数据的,与序列式容器不同的是其里面存储的是< key , value >
结构的键值对,在数据检索时比序列式容器效率更高。
键值对
键值对:用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key
和value
,key
代表键值,value
表示与key
对应的信息。
(比如:建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。)
SGI-STL
中关于键值对的定义:
template<class T1,class T2>
class pair {
typedef T1 first_type;
typedef T2 second_type;
first_type first;
second_type second;
pair(const first_type& a,const second_type& b)
:first(a)
,second(b)
{
}
};
树形关联式容器
根据应用场景的不同,STL
总共实现了2
种不同结构的关联式容器:树型结构 与 哈希结构。
树型结构的关联式容器主要有四种:
map
set
multimap
multiset
这四种容器的共同点是:底层使用了平衡搜索树(即红黑树),容器中的元素是一个有序的序列。
map
map
是关联容器,它按照特定的次序(按照key
来比较)存储由键值key
和值value
组合而成的元素。- 在
map
中,键值key
通常用于排序和唯一标识元素,而值value
中存储与此键值key
关联的内容。键值key
和值value
的类型可能不同,并且在map
的内部,key
与value
通过成员类型value_type
绑定在一起,为其取别名称为pair
typedef pair value_type;
- 在内部,
map
中的元素总是按照键值key
进行比较排序的。 map
中通过键值访问单个元素的速度通常比unordered_map
容器慢,但map
允许根据顺序对元素进行直接迭代(即对map
中的元素进行迭代时,可以得到一个有序的序列)map
支持下标访问符,即在[]
中放入key
,就可以找到与key
对应的value
。map
通常被实现为二叉搜索树(更准确是平衡二叉搜索树(红黑树))。
使用方法
template< class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, //缺省/ map::key_compare
class Alloc = allocator < pair<const Key, T> >
//缺省/ allocator_type:allocator_type
> class map;
key
: 键值对中key
的类型T
: 键值对中value
的类型Compare
: 比较器的类型
map
中的元素是按照key
来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则。
(一般情况下按照函数指针或者仿函数来传递)Alloc
:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器
注意:在使用map时,需要包含头文件:
#include <map>
。
它的构造函数、迭代器都与之前的容器没有太大区别。但其[]
操作符的重载有些不同:
- 函数:
mapped_type