关联容器将 value(值)与 key(键)关联在一起,并使用 key 来查找 value;
关联容器的优势是,提供元素的快速访问,也允许插入元素(但是不能固定位置插入)
STL提供了四种有序关联容器:(底层都是树)
- set: 集合,key 唯一且 key 就是 value
- multiset: key 不唯一
- map: key 与 value 不同,key 唯一
- multimap: key 不唯一
set
- < set > 头文件
- 可反转、排序
- 集合的并集、交集、差集
- set_union( ):并集
- set_intersection( ):交集
- set_difference( ):A减A并B
- 边界方法
- .lower_bound( a ):迭代器指向第一个不小于 a 的元素;
- .upper_bound( b ):指向第一个大于 b 的元素;
一些函数用法:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
#include <set>
...
set<string> A = {...}, B = {...};
//将A U B依次插入到C中(注意不能用copy)
set<string> C;
set_union(A.begin(), A.end(), B.begin(), B.end(),
insert_iterator<set<string> >(C, C.begin()));
//输出C中大于等于“ghost”,小于“spook”的元素
copy(C.lower_bound("ghost"), C.upper_bound("spook"),
ostream_iterator<string, char>(cout, "\n"));
multimap
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
typedef multimap<int, string> MapCode;
...
multimap<int, string> codes;
...
//在codes中查找 key == 718 的容器并输出其 value
pair<MapCode::iterator, MapCode::iterator> range = codes.equal_range(718);
for (auto it = range.first; it != range.second; ++it)
cout << it->second << endl;
需要注意的是,equal_range返回的是一个pair<MapCode::iterator, MapCode::iterator>的二元组,组内两个元素都是查找类的迭代器;前一个指向第一个 key == 718 的容器,
后一个指向第一个 key != 718 的容器(类似begin与end);
无序关联容器
底层是基于数据结构hash表的;
- unordered_set
- unordered_multiset
- unordered_map
- unordered_multimap