关联式容器
关联式容器也是用于存储数据的,其与序列式容器不同,内部存储的是键值对结构的数据,且在数据检索方面比序列式容器效率要更高。
键值对
键值对是用来表示具有一一对应关系的一种结构,这种结构一般只包含有两个成员变量:key 和 value。
key 代表键码,value 表示与 key 所对应的信息。
SGI-STL(stl_pair.h)中对pair(键值对)结构的定义如下:
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中总共实现了两种不同结构的关联式容器:树型结构与哈希结构。
树型结构的关联式容器主要介绍四种:set,multiset,map,multimap
这四种容器的共同点是:在底层都是用红黑树实现的,都是默认按照小于的方式进行元素的比较。
而set和map具有排序+去重的作用。
set

向set中插入元素时,只需插入value即可,但在底层实际存储的是由构成的键值对。
set中的元素默认是按照小于来比较的,使用set的迭代器遍历set中的元素,可以得到一个有序序列。
set成员函数常用功能介绍
- Constructor
| 函数声明 | 功能介绍 |
|---|
| set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); | 构造空的set |
| set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); | 用[first, last)迭代器区间中的元素构造set |
| set (const set& x); | 拷贝构造 |
- Iterators
| 函数声明 | 功能介绍 |
|---|
| iterator begin(); | 返回set起始位置元素的迭代器 |
| iterator end(); | 返回set末尾位置元素下一个位置的迭代器 |
| reverse_iterator rbegin(); | 返回set末尾位置元素下一个位置的迭代器 |
| reverse_iterator rend(); | 返回set起始位置元素的迭代器 |
| const_iterator cbegin() const; | 返回set起始位置元素的const迭代器 |
| const_iterator cend() const; | 返回set末尾位置元素下一个位置的const迭代器 |
| const_reverse_iterator crbegin() const; | 返回set末尾位置元素下一个位置的const迭代器 |
| const_reverse_iterator crend() const; | 返回set起始位置元素的const迭代器 |
- Capacity
| 函数声明 | 功能介绍 |
|---|
| bool empty() const; | set为空返回true, 否则返回false |
| size_type size() const; | 返回set中有效元素的个数 |
- Modifiers
| 函数声明 | 功能介绍 |
|---|
| pair insert (const value_type& val); | 在set中插入元素val,实际插入的是构成的键值对。如果插入成功,返回<元素在set中的位置, true>,如果插入失败,即val在set中已经存在,返回 |
| void insert (InputIterator first, InputIterator last); | 向set中插入[first, last)迭代器区间中的元素 |
| void erase (iterator position); | 删除position位置的元素 |
| size_type erase (const value_type& val); | 删除set中的val元素,并返回删除元素的个数 |
| void erase (iterator first, iterator last); | 删除set中[first, last)迭代器区间的元素 |
| void swap (set& x); | 两个set对象变量进行交换 |
| void clear(); | 将set中的元素清空 |
- Operations
| 函数声明 | 功能介绍 |
|---|
| iterator find (const value_type& val) const; | 找到了返回set中值为val的元素的位置,否则返回end() |
| size_type count (const value_type& val) const; | 返回set中值为val的元素的个数 |
| iterator lower_bound (const value_type& val) const; | 返回大于等于val元素位置的迭代器 |
| iterator upper_bound (const value_type& val) const; | 返回小于val元素位置的迭代器 |
map

key:键值对中key的类型。map中的key是唯一的,且不能修改。
T:键值对中value的类型。
map成员函数常用功能介绍
- Constructor
| 函数声明 | 功能介绍 |
|---|
| map (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); | 构造一个空的map |
| map (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); | 用[first, last)迭代器区间中的元素构造map |
| map (const map& x); | 拷贝构造 |
- Iterators
与set的迭代器功能类似。
- Capacity
与set的容量操作功能类似。
- Element access
| 函数声明 | 功能介绍 |
|---|
| mapped_type& operator[] (const key_type& k); | map中有这个k,返回value的引用,相当于查找+修改;map中没有这个k,会插入一个pair(key, V()),返回value的引用,相当于插入+修改 |
| mapped_type& at (const key_type& k); | 与operator[]功能类似,不同的是,k不存在时是直接抛异常 |
mapped_type& operator[] (const key_type& k)
{
return ( *( ( this->insert( make_pair( k,mapped_type() ) ) ).first ) ).second
}
- Modifiers
| 函数声明 | 功能介绍 |
|---|
| pair insert (const value_type& val); | key已经在map中,返回pair(key_iterator, false);key不在map中,返回pair(new_key_iterator, true) |
| void insert (InputIterator first, InputIterator last); | 向map中插入[first, last)迭代器区间中的元素 |
| void erase (iterator position); | 删除position位置的元素 |
| size_type erase (const key_type& k); | 删除map中k对应的元素,并返回删除元素的个数 |
| void erase (iterator first, iterator last); | 删除map中[first, last)迭代器区间的元素 |
| void swap (map& x); | 两个map对象变量进行交换 |
| void clear(); | 将map中的元素清空 |
- Operations
| 函数声明 | 功能介绍 |
|---|
| const_iterator find (const key_type& k) const; | 在map中查找key为k的元素,找到了就返回元素的位置,否则返回end() |
| size_type count (const key_type& k) const; | 返回key为k的元素在map中的个数,这个函数可以用来检测一个key是否在map中 |
| iterator lower_bound (const key_type& k); | 返回大于等于k的元素位置的迭代器 |
| iterator upper_bound (const key_type& k); | 返回小于k的元素位置的迭代器 |
multiset & multimap
multiset与set的区别是,multiset中的元素可以是重复的,而set中的元素是唯一的。
multimap与map的区别是:multimap中的key是可以重复的,而map中的key是唯一的。multimap没有重载operator[]操作。