1. 关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问。
map | 关联数组: 元素通过键来存储和读取 |
set | 大小可变的集合,支持通过键实现的快速读取 |
multimap | 同一个键多次出现的map类型 |
multiset | 同一个键多次出现的set类型 |
2. pair类型
pair<T1, T2> | 创建一个空的pair类型,两个元素类型为T1 T2, 采用值初始化 |
pair<T1, T2>p1(v1, v2) | 创建一个pair对象,first成员初始化为v1, second成员初始化为v2 |
make_pair(v1, v2) | 以v1 v2值创建一个新的pair对象 |
p1 < p2 | 遵循字典次序: 如果p1.first < p2.first 或者 !(p1.first<p2.first) && p1.second <p2.second, 则返回true |
p1 == p2 | 两个pair对象的first 和 second 都相等,则两对象相等 |
p1.first | |
p.second |
3. 顺序容器和关联容器公共的操作
构造函数 C<T> c; C<T> c1(c2); C<T> c(b, e); | 关联容器不能通过容器大小来定义 |
关系运算 | |
begin 、end、rbegin、rend | |
容器的类型别名 size_type value_type 等 | 对map类型,value_type并非元素类型,而是键值对的 pair 类型 |
swap 操作和赋值操作 | 关联容器不提供assign函数 |
clear 和 erase | 关联容器的erase运算返回void |
容器大小的操作 size、empty()、max_size() | resize函数不能用于关联容器 |
4. map的构造函数
map<k, v> m; | 对应键类型,唯一的约束就是必须支持 < 操作符。 |
map<k, v> m(m2); | |
map<k, v> m(b, e) | 元素b, e范围内的元素类型,必须能转换为 pair<const k, v> |
5. map定义的类型
map<k, v>::key_type | map中索引键的类型 key_type不包含const, pair的first 包含const |
map<K, V>::mapped_type | map中值的类型 |
map<K, V>::value_type | 一个pair类型,它的first元素具有const map<K, V>::key_type类型, second元素具有map<K, V>::mapped_type类型 它的值成员可以修改,但键成员不能修改 |
6. 给map添加元素
对map容器,如果下标所表示的键在容器中不存在,则添加新元素。
//用来记录单词出现的次数
map<string, int> word_count;
string word;
while(cin >> word)
++word_count[word];
m.insert(e) | 如果e.first不在m中,则插入新元素; 如果键存在,则m保持不变; 返回一个pair对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素 |
m.insert(beg, end) | 返回void类型 |
m.insert(iter, e) | ??? |
word_count.insert(make_pair("Anna", 1));
//或者
typedef map<string, int>::value_type valType;
word_count.insert(valType("Anna", 1));
7. 查找并读取map中的元素
m.count(k) | 返回m中k的出现次数 。 如果返回非0,则可以使用下标操作符来获取该键所关联的值,不必担心这样做会在map中插入新元素。 |
m.find(k) | 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。 如果不存在,则返回超出末端的迭代器 |
8. 从map对象中删除元素
m.erase(k) | 删除m中键为K的元素。 返回size_type类型的值,表示删除的元素个数。 |
m.erase(p) | 从m中删除迭代器p所指的元素。 返回void类型 |
m.erase(b, e) | b,e为指向m的一段有效范围 返回void类型 |
9. set类型
set不支持下标操作符,而且没有定义mapped_type类型。
set存储的元素仅仅是键,而没有所关联的值。
带有一个键参数的insert版本返回pair类型对象,使用迭代器的insert版本返回void类型。
set中的键也为const。 在获取指向set中某元素的迭代器后,只能对其做读操作,不能做写操作。
10. multimap 和 multiset 类型
multimap 不支持下标运算;
每次调用insert 总会添加一个元素。
带有一个键参数的erase版本,将删除拥有该键的所有元素,并返回删除元素的个数。带有一个或一对迭代器参数的版本,只删除指定的元素,并返回void。
11. 在multimap 和 multiset 中查找元素
(1)使用find 和 count 操作
(2)返回迭代器的关联容器操作
m.lower_bound(k) | 返回一个迭代器,指向键不小于k的第一个元素 |
m.upper_bound(k) | 返回一个迭代器,指向键大于k的第一个元素 |
m.equal_range(k) | 返回一个迭代器的pair对象 它的first成员等价于m.lower_bound(k),而second成员则等价于m.upper_bound(k) |
<END>