map和set
一、关联式容器 键值对
序列式容器
vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。
关联式容器
也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高
键值对
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息
源码中关于键值对的描述:
template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{
}
pair(const T1& a, const T2& b): first(a), second(b)
{
}
};
根据应用场景不同,STL总共实现了两种不同结构的关联式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结构,容器中的元素是一个有序的序列。
二、pair 和 make_pair
这个类将一对可能是不同类型的值(T1 和 T2)耦合在一起。 可以通过其公共成员first和second访问各个值,键值对就是这样被耦合在一起的,这有许多益处,比如用pair类型作为返回值,可以同时返回键值对的两个数据。
make_pair用来构造一个 pair 对象,它的第一个元素设置为 x,第二个元素设置为 y,在map和set中会经常使用:
三、K模型 & KV模型
K模型和KV模型都是二叉搜索树的应用:
K模型:
K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。
KV模型:
每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。
比如:实现一个简单的英汉词典,可以通过英文找到与其对应的中文,实现方式如下:
<单词,中文含义>为键值对构造二叉搜索树,注意:二叉搜索树需要比较,键值对比较时只比较
Key
查询英文单词时,只需给出英文单词,就可快速找到与其对应的Value
四、set
-
set是按照一定次序存储元素的容器
-
在set中,元素的key标识它,类型为T