除了顺序容器,标准库还提供了三种顺序容器适配器:queue,prority_queue,stack。 容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。 适配器通用的操作和类型 见 27 适配器通用的操作和类型。
使用适配器时,必须包含相关的头文件: #include
初始化:strck
stack
stack栈可以建立在vector,list,或者deque容器上,queue适配器要求其关联的容器必须提供push_queue运算,因此只能建立在list容器上,priority_queue适配器要求随机访问,因此只能建立在vector或deque容器上。
栈容器适配器支持的操作 见 28 栈容器适配器支持的操作
s.empty() s.size() s.pop() s.top() s.push(item)
标准库提供了两个风格的队列:FIFO队列(简称queue)和优先级队列(priority queue)。 priority queue允许用户为队列中存储的元素设置优先级,新元素是放在比它优先级低的元素前面,使用<操作符来确定它们之间的优先级关系。
队列和优先级队列支持的操作 见 29 队列和优先级队列支持的操作
q.empty() q.size() q.pop() q.front()---只适用于队列 q.back()---只适用于队列 q.top()---只适用于优先级队列 q.push(item) 第十章 关联容器
关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
关联容器支持通过键来高效地查找和读取元素,两个基本的关联容器类型是map和set,map的元素以键-值(key-value)对的形式组织:键用于元素在map中的索引,而值则表示所存储和读取的数据,set只包含一个键,并有效地支持关于某个键是否存在的查询。 关联容器类型:见 30 关联容器类型
map set multimap multiset
set和map类型不允许为同一个键添加第二个元素,如果一个键必须对应多个实例,则需要使用multimap或multiset类型
pair类型(定义在utility头文件中)提供的操作 见 31 pair类型提供的操作
pair pair pair typedef pair pair类型可直接访问其数据成员:其数据成员都是公有的,命名为first和second。只需要使用点操作符即可访问其成员。如:author.first ==”ksh”; pair while (cin >> first >> last) { next_anth = make_pair(first, last);} 关联容器提供的操作 见 31 关联容器提供的操作 map对象:需要包含map头文件。定义map对象时,需要同时指定键和值的类型。 map构造函数: map 对于键类型,唯一的约束就是必须支持<操作符。 map定义的类型 见 31 map定义的类型 map 它的first元素具有const map value_type是pair类型,它的值成员可以修改,但是键值不能修改。 map迭代器进行解引用将产生pair类型的对象。 map下标操作符返回一个mapped_type类型的值。 对于map容器,下标所表示的键在容器中存在,则返回值,不存在,则添加新元素。 map while (cin >> word) ++word_count[word]; map容器提供的insert操作 见 32 map容器提供的insert操作 m.insert(e) m.insert(beg, end) m.insert(iter, e) 以insert代替下标运算: word_cont.insert(map word_count.insert(make_pair(“Anna”, 1)); 或者typedef map 下标操作符给出了读取一个值的最简单的方法: map int occurs = word_count[“foobar”]; 该操作存在一个危险的副作用:如该键不在map容器中,那么下标操作会插入一个具有该键的新元素。 所以,map容器提供了两个操作:count和find,用于检查某个键是否存在而不会插入该键。 m.count(k)----返回m中k出现的次数(对于map返回值只能是1或者0) m.find(k)-----如果m容器中存在按k索引的元素,则返回指向该元素的迭代器,如果不存在,则返回超出末端迭代器。 读取元素而不插入该元素: int occurs = 0; map 从map容器中删除元素 见 33 从map容器中删除元素 m.erase(k) m.erase(p) m.erase(b, e) map对象的迭代遍历:map也提供begin和end运算 map cout << map_it->first <<”” << map_it->second < set容器只是单纯的键的集合,当指向知道一个值是否存在时,使用set容器是最适合的 set类型 见 34 set类型