包括: map, set, multimap, multiset
一。pair类型
1. pair<T1, T2> p1. 创建一个空的pair对象,它的两个元素分别是T1和T2类型,比如int, string, 采用值初始化。p1为名字,比如tmp。
2. pair<T1, T2> p1(v1, v2)
3. make_pair(v1, v2). 以v1和v2值创建一个新的pair对象,其元素类型分别是v1和v2的类型
4. p1 < p2. 如果p1.first < p2.first或者!(p2.first < p1.first) && p1.second < p2.second, 返回true
5. p1 == p2, p1.first == p2.first && p1.second == p2.second.
6. p.first, p.second
二。 关联容器操作
1. 构造函数
C<T> c
C<T> c1(c2)
C<T> c(b, e)
2. 关系运算
3. begin, end, rbegin, rend操作
4. swap和赋值操作,没有assign操作
5. clear, erase操作
6. size, empty操作,没有resize操作
三。 map
1. 构造函数
map<k, v> m;
map<k, v> m(m2);
map<k, v> m(b, e);
2. map<K, V>::key_type, 键类型
map<K, V>::mapped_type 值类型
map<K, V>::value_type pair类型,first为键类型,second为值类型
3. map添加元素
两种方法。
第一种: map<string, int> word_count;
word_count["anna"] = 1;
第二种: m.insert(e) e是一个用在m上的value_type类型的值。如果键(e.first)不在m中,则插入一个值为e.second的新元素,如果该键在m中已存在,则保持m不变。该函数返回一个 pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素。
m.insert(beg, end) beg和end位迭代器,返回void类型
m.insert(iter, e) 如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返回一个迭代器,指向m中具有给定键的元素
比如word_count.insert(map<string, int>::value_type("Anna", 1));
或者word_count.insert(make_pair("Anna", 1));
或者typedef map<string, int>::value_type valType;
word_count.insert(valType("Anna", 1));
做m.insert(e)操作时返回一个值:包含一个迭代器和一个bool值的pair对象,其中迭代器指向map中具有相应键的元素,而bool值表示是否插入了改元素(如果已经有则是false,如果 没有则为true。比如
map<string, int> word_count;
string word;
while (cin >> word) {
pair<map<string, int>::iterator, bool> ret = word_count.insert(make_pair(word, 1));
if (!ret.second) ++ret.first->second;
4. 查找并读取map元素
下标操作符方法比较危险,如果该键不在map容器中,那么下标操作会插入一个具有该键的新元素。推荐使用count或者find.
m.count(k) 返回m中k的出现次数
m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器
比如map<string, int>::iterator it = word_count.find("foobar");
if (it != word_count.end()) occurs = it->second;
5. 删除元素
m.erase(k) 返回size_type类型值,表示删除的元素个数
m.erase(p) 删除迭代器p所指向的元素。p不能等于m.end()
m.erase(b, e)
四。 set
set容器只是单纯的键的集合,支持的操作基本上与map提供的相同
五。multimap和multiset
一个键对应多个实例。不能使用下标操作。添加操作总会添加一个元素,删除操作会删除该键的所有元素。
1. 查找元素
第一种方法,用find和count操作,count求出某键出现的次数,find返回一个迭代器,指向第一个拥有正在查找的键的事例,拥有相同键的多个实例相邻存放的。比如
string search_item("Alain de Botton");
typedef multimap<string, string>::size_type sz_type;
sz_type entries = authors.count(search_item);
multimap<string, string>::iterator iter = author.find(search_item);
for (sz_type cnt = 0; cnt != entries; ++cnt, ++iter)
cout << iter->second << endl;
第二种方法,使用lower_bound和upper_bound操作。
m.lower_bound(k) 返回一个迭代器,指向键不小于k的第一个元素。
m.upper_bound(k) 返回一个迭代器,指向键大于k的第一个元素
lower_bound返回的迭代器不一定指向拥有特定键的元素。如果该键不在容器中,则lower_bound返回在保持容器元素顺序的前提下该键应被插入的第一个位置。重写上面那段程序为
typedef multimap<string, string>::iterator author_it;
authors_it beg = authors.lower_bound(search_item), end = authors.upper_bound(search_item);
while (beg != end) {
cout << beg->second << endl;
++beg;
}
第三种方法是使用equal_range函数。equal_range函数返回存储一对迭代器的pair对象。如果该值存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一个位置。如果找不到匹配的元素,则pair对象中的两个迭代器都将指向此键应该插入的位置。重写程序如下
pair<authors_it, authors_it> pos = authors.equal_range(search_item);
while (pos.first != pos.second) {
cout << pos.first->second << endl;
++pos.first;
}