这篇文章主要是讲map、set的接口及应用,模拟实现在之后
--------
关联式容器
在之前,我们学过vector、list、deque,这些称之为序列式容器,因为其底层是线性的,里面存储的就是元素本身。
关联式容器的区别就在于,里面存储的不再是单独的一个元素,它存储的是键值对(key,value),在检索的时候效率会更高。
键值对
那什么是键值对?
可以这么理解,其本身是一个结构体,里面是这样的;
template <class T1, class T2>
struct pair
{
T1 first;
T2 second;
pair()
: first(T1())
, second(T2())
{}
pair(const T1& a, const T2& b)
: first(a)
, second(b)
{}
};
在里面有两个元素,这两个元素都是模板类型,里面第一个类型的T1,这个就是键值对里面的键(Key),而T2,就是Key对应的值(Value)。
我们在使用的时候,通过Key来找到对应的Value。
这里面提供了两个默认构造看看就好,不算难理解。
树形结构的关联式容
根据应用场景不同,有以下几种:
set
muitiset
map
multimap
set
set - C++ Reference (cplusplus.com)
模板参数:
这里简单概括一下其内容;
set里面的内容是唯一的
放进去就不能被修改,但可以插入或者删除
set里面是排好序的(迭代器实现的是中序,打印出来是升序)
底层是二叉搜索树(红黑树)实现
跟map不同,map是<Key,Value>,set是<Value,Value>,Value就是对应的Key
查找效率是logN
这里直接看它的接口:
构造
函数声明 | 功能介绍 |
set (const Compare& comp = Compare(), const Allocator& = Allocator() ); |
构造空的set |
set (InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator() ); |
用[first, last)区 间中的元素构造 set |
set ( const set<Key,Compare,Allocator>& x); | set的拷贝构造 |
用的最多的应该是第一个,其次是第二个,拷贝构造不算多
迭代器
iterator begin() | 返回set中起始位置元素的迭代器 |