C++ Primer 第9章 顺序容器
标准库定义了一系列顺序容器类型。容器是用于存储某种给定类型对象的模板类型。在顺序容器中,所有元素根据其位置排列和访问。顺序容器共享一组通用的已标准化的接口:如果两种顺序容器都提供某一操作,那么该操作具有相同的接口和含义。所有容器都提供(有效的)动态内存管理。程序员在容器中添加元素时,不必操心元素存放在哪里。容器自己实现其存储管理。
最经常使用的容器类型是 vector,它支持对元素的快速随机访问。可高效地在 vector 容器尾部添加和删除元素,而在其他任何位置上的插入或删除运算则要付出比较昂贵的代价。deque 类与 vector 相似,但它还支持在 deque 首部的快速插入和删除运算。list 类只支持元素的顺序访问,但在 list 内部任何位置插入和删除元素都非常快速。
标准库定义了三种顺序容器类型:vector、list 和 deque
1. 容器元素的初始化
数组初始化vector
int iarr[] = {11,22,33};
size_t iarr_size = sizeof(iarr) / sizeof(int);
vector<int> ivec(iarr,iarr+port_size);
将一个容器初始化为另一个容器的副本
vector<int> ivec;
vector<int> ivec2(ivec); // ok: ivec is vector<int>
list<int> ilist(ivec); // error: ivec is not list<int>
vector<double> dvec(ivec); // error: ivec holds int not double
list<string> slist(svec.begin(), svec.end());
2. 迭代器
所有容器迭代器都支持以解引用运算从容器中读入一个元素。容器都提供自增和自减操作符来支持从一个元素到下一个元素的访问。
*iter 返回迭代器 iter 所指向的元素的引用
iter->mem 对iter 进行解引用,获取指定元素中名为 mem 的成员。等效于 (*iter).mem
++iter iter++ 给 iter 加 1,使其指向容器里的下一个元素
--iter iter-- 给 iter 减 1,使其指向容器里的前一个元素
iter1 == iter2
iter1 != iter2 比较两个迭代器是否相等(或不等)。当两个迭代器指向同一个容器中的同一个元素,或者当它们都指向同一个容器的超出末端的下一位置时,两个迭代器相等
begin 和end成员
begin 和 end 操作产生指向容器内第一个元素和最后一个元素的下一位置的迭代器。
c.begin() 返回一个迭代器,它指向容器 c 的第一个元素
c.end() 返回一个迭代器,它指向容器 c 的最后一个元素的下一位置
c.rbegin() 返回一个逆序迭代器,它指向容器 c 的最后一个元素
c.rend() 返回一个逆序迭代器,它指向容器 c 的第一个元素前面的位置
3. 其它容器stack,queue
队列和优先级队列支持的操作
q.empty() 如果队列为空,则返回 true,否则返回 false
q.size() 返回队列中元素的个数
q.pop() 删除队首元素,但不返回其值
q.front() 返回队首元素的值,但不删除该元素该操作只适用于队列
q.back() 返回队尾元素的值,但不删除该元素
q.top() 返回具有最高优先级的元素值,但不删除该元素
q.push(item) 对于 queue,在队尾压入一个新元素,对于 priority_quue,在基于优先级的适当位置插入新元素