顺序容器:vector、list、deque、queue、stack、slist。
关联容器:map、set、multiset、multimap、hashtable(散列表),以及以hashtable为底层机制完成的hash_set(散列集合)/hash_map(散列映射表)/hash_multiset(散列多键集合)/hash_multimap(散列多键映射表)。
本文总结了Primer上的内容包括set、multiset、map、multimap。
关联容器注意点
(1)关联容器不提供front、push_front、pop_front、back、push_back以及pop_back接口;
(2)关联容器的三种构造函数:C<T> c; C<T>c1(c2)和 C<T>c(b,e);不能通过容器大小来定义。
(3)关联容器不提供assign函数;
(4)关联容器提供clear和erase操作;
(5)关联容器的健类型,必须相关的比较函数。默认情况下,标准库采用键的"<"操作符来实现键的比较。
(6)关联容器两个常用的接口:find和count;
map关联容器
1、pair类型
构造函数:pair<T1,T2>p1、pair<T1,T2>p1(v1,v2);除了这样还可以用make_pair来生成pair。
p1.first:第一个成员;(公有成员、可直接访问)
p1.second:第二个成员;(公有成员、可直接访问)
2.map 键-值对集合
map定义的三个数据类型:key_type(键的类型)、mapped_type(键关联值的类型)和value_type(pair类型、用map::iterator获得的数据类型也是pair类型)
map<string,int>word_count; word_count["Anna"] = 1;
上面程序所执行的操作:(1)在word_count中查找“Anna”,没有找到;
(2)插入一个新的默认键值对插入;
(3)读出这个键值对,并将其值赋为1。
注;使用下标访问map中的元素,如果map不存在这个元素,将添加元素。
利用上面这个特性可以编一个单词统计程序:
map<string,int>word_count; string word; while(cin>word){ ++word_count[word] }
<iterator bool> insert(e);//e是一个pair类型的值,如果map中已存在e,则不插入,返回<e.first,false>;否则插入,返回<e.first,true>。
insert(beg,end);//将迭代器beg---end之间插入map中。(类型必须是pair类型)
范例1:
word_count.insert(make_pair("Anna",1));
范例2:
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)//表示map中已经存在 ++ret.first->second; }
//find找到了返回其迭代器,找不到返回end map<string,int>::iterator iter = word_count.find("lsj"); if(iter!=word_count.end())//不等于end表示找到了,没有等于end ... //count查找的键值在map中的个数,0表示没有,1表示有(map中只能为1) int occurs = 0; if(word_count.count("lsj"))//找到 occurs = word_count["lsj"]
m.erase(k);//删除键为k的元素
m.erase(p);//删除迭代器p所指向的元素
m.erase(b,e);//删除迭代器之间的元素
set关联容器
set中只有键类型,操作和map一样,没有值类型。
multiset、multimap关联容器
(1)multiset和multimap不支持下标元素,因为有可能某个键对应的元素不只一个。
(2)erase(k)会删除所有键为“k”的元素,返回删除的个数。
(3)find操作返回第一个拥有正在查找键的实例。
(4)count()输出指定键元素的个数。
(5)额外的接口:m.lower_bound(k):返回指向键不小于k的第一个元素;
m.upper_bound(k):返回指向键大于k的第一个元素;上面两者合起来正好是键等于K的范围。
m.equal_range(k):返回pair类型。<first,second>,其实first = m.lower_bound(k),second = m.upper_bound(k)
//这么实现 typedef multimap<string,string>::iterator Iter; Iter beg = author.lower_bound(search_item); Iter end= author.upper_bound(search_item); while(beg!=end){ ... ++beg; } //或者这么编 pair<Iter,Iter> pos = uthor.equal_range(search_item); while(pos.first!=pos.second){ .... pos.second++; }