关联容器
简介
对于关联容器,它的每个元素都有一个键(key),容器中的元素的顺序并不能人为随意决定,而是按照键的取值升序排列的。也就是说,对于一个关联容器s,使用迭代器在 [s.begin(),s.end() )区间内遍历,访问到的序列总是升序的。
分类
按照容器中是否允许出现重复键值,关联容器可分为单重关联容器和多重关联容器,单重关联容器中的键值是唯一的,不允许重复,集合和映射属于这一类;多重关联容器中,相同的键值允许重复出现,多重集合和多重映射属于这一类。按照键与元素的关系可以分为简单关联容器和二元关联容器。简单关联容器以元素本身作为键,集合和多重集合属于这一类;二元关联容器的元素是由键和某种类型的附加数据共同构成,键只是元素的一部分,映射和多重映射属于这一类
类型 | 简单管理容器 | 二元关联容器 |
单重关联容器 | 集合(set) | 映射(map) |
多重关联容器 | 多重集合(multiset) | 多重映射(multimap) |
二元组pair
二元关联容器的元素类型是键类型和附加数据类型的组合,这种组合类型可以用一个二元组(pair)来表示,pair是<utility>头文件中定义的结构体模板:
template<class T1,class T2>
struct pair{
T1 first; //二元组的第一元
T2 second; //二元组的第二元
pari(); //默认构造函数
pair(const T1 &x,const T2 &y); //构造first=x,second=y的二元组
template<class U,class V>pair(const pair<U,V>&p); //复制构造函数
};
关联容器的共性
假设S表示容器的类型,s表示S类型的实例,用T表示S容器的元素类型,用t表示T类型的一个实例,用K表示S容器的键的类型,用k表示K的一个实例,用n表示一个整型数据,用p1和p2表示指向s中的元素的迭代器,用q1,q2表示任何一个指向T类型元素的输入迭代器,关联容器的基本功能如下所示:
操作 | 功能 | 单重关联容器 | 多重关联容器 |
S s | 构造一个空容器 | 构造一个空容器 | 构造一个空容器 |
S s(q1,q2) | 将 [q1,q2)区间的数据作为s的元素构造s | 当[q1,q2)范围内出现具有相同键的元素时,只有一个元素会被加入s中 | [q1,q2)范围内的所有元素均被无条件加入s中 |
操作 | 功能 | 单重关联容器 | 多重关联容器 |
s.insert(t) | 将元素t插入s容器中 | 只有当不存在相同键的元素时才能成功插入,该函数返回类型为pair<S::iterator,bool>。插入成功时,返回被插入元素的迭代器,否则返回与t的键相同的元素的迭代器和false | 插入总会成功,返回已插入元素的迭代器 |
s.insert(p1,t) | 将元素t插入s容器中,p1是一个提示的插入位置,如果提示位置准确(即t的键的大小刚好在p1-1和p1之间)则可以提高插入效率。即使提示位置不准确也可以正确完成插入操作,该函数总是返回一个迭代器 | 只有当不存在相同键的元素时才能成功插入,插入成功时,返回被插入元素的迭代器,否则返回与t的键相同的元素的迭代器 | 插入总会成功,返回已插入元素的迭代器 |
s.insert(q1,q2) | 相当于按顺序对 [q1,q2) 区间内的每个元素x分别执行s.insert(x) | 略 | 略 |
s.erase(p1) | 删除p1所指向的元素 |
s.erase(p1,p2) | 删除 [p1,p2) 区间内的元素 |
s.erase(k) | 删除所有键为k的元素,返回被删除元素的个数 |
s.find(k) | 找到任意一个键为k的元素,返回该元素的迭代器,如果s中没有键为k的元素,则返回s.end() |
s.lower_bound(k) | 得到s中第一个键值不小于k的元素的迭代器 (第一个>=k的元素) |
s.upper_bound(k) | 得到s中第一个键值大于k的元素的迭代器 (第一个>k的元素) |
s.equal_range(k) | 得到一个用pair<S::iterator,S::iterator>表示的区间,记为 [p1,p2) 。该区间刚好包含所有键值为k的元素,p1==s.lower_bound(k)和p2==s.upper_bound(k)一定成立 |
s.count(k) | 得到s容器中键为k的元素个数 |
注:关联容器的插入和删除操作不会使任何已有的迭代器、指针或引用失效。