顺序容器:vector、list、queue、deque。
为了定义一个容器类型的对象,必须先包含相关头文件,即
#include
#include
#include
#include
容器是类模板,要定义某种特殊的容器,必须在容器名后加一对尖括号,尖括号里面提供容器中存放的元素的类型:
vector svec;
list ilist;
queue items;
C c(c2);//创建容器c2的副本c;
将一个容器复制给另一个容器时,类型必须匹配,容器类型和元素类型都必须相同。
通过使用迭代器将一种容器内的元素复制给另一种容器。
//用svec的每个元素给slist赋值
list slist(svec.begin(),svec.end());
//用svec的部分元素给slist赋值
vector::iterator mid=svec.begin()+svec.size()/2;//找到svec的中间位置
deque front(svec.begin(),mid);
deque back(mid,svec.end());
使用迭代器,不要求容器类型相同,容器内的元素类型也可以不相同。
常用迭代器运算包括:
*iter: 返回iter所指向的元素的引用
iter->mem: 对iter进行解引用,获取指定元素中名为mem的成员。等效于(*iter).mem
++iter
iter++
--iter
iter--
iter1==iter2
iter1!=iter2//比较两个迭代器是否相等,当它们指向同一个容器中的同一个元素或超出末端的下一位置时,两个迭代器相等
对vector和queue而言,还有另外的迭代器操作:
iter + n
iter - n
iter1 += iter2
iter1 -=iter2
iter1-iter2
迭代器范围是一个左闭合区间,其标准表示方式为:
[frist,last)
它表示范围从frist开始,到last结束,但不包括last。
c.begin() :返回一个迭代器,指向容器c的第一个元素
c.end() :返回一个迭代器,指向容器c的最后一个元素的下一位置
c.rbegin():返回一个逆序迭代器,它指向c的最后一个元素
c.rend():返回一个逆序迭代器,它指向c的第一个元素的前面的位置
STL提供了三种顺序容器适配器:queue、priority_queue和stack。使用适配器时,必须包含相关的头文件:
include
include
适配器有两个构造函数:默认构造函数用于创建空对象,而带一个容器参数的构造函数将参数容器的副本作为其基础值。如:
stack stk;
queue deq;
stack stk(deq);
queue que[10];//如果想建立元素是队列的数组,可以这样声明
默认的stack和queue都基于deque容器实现,而priority_queue则基于vector实现。
stack提供的所有操作如下:
s.empty() //如果栈为空,则返回true,否则返回false。
s.size() //返回栈中元素的个数
s.pop() //删除栈顶元素,但不返回其值
s.top() //返回栈顶元素的值,但不删除它
s.push(item)//在栈顶压入新元素
STL提供了两种风格的队列:FIFO队列(简称队列,queue)以及优先级队列。首先是queue,它的常用操作有:
q.empty() //如果队列为空,则返回true,否则返回false。
q.size() //返回队列中元素的个数
q.pop() //删除队首元素,但不返回其值
q.front() //返回队首元素的值,但不删除它
q.back() //返回队尾元素的值,但不删除它
q.push(item)//在队尾压入新元素
priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级。
定义:priority_queue
Type 就是数据类型,
Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),
Functional 就是比较的方式,
当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
//升序队列
priority_queue ,greater > q;
//降序队列
priority_queue ,less >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
自定义类型需要重载仿函数:
struct cmp{
bool operator() ( Node a, Node b ){//默认是less函数
//返回true时,a的优先级低于b的优先级(a排在b的后面)
if( a.x== b.x ) return a.y> b.y;
return a.x> b.x; }
};
priority_queue<Node, vector<Node>, cmp> q;
注意到,priority_queue的操作接口和stack是一样的:
q.empty() //如果priority_queue为空,则返回true,否则返回false。
q.size() //返回priority_queue中元素的个数
q.pop() //删除priority_queue首元素,但不返回其值
q.top() //返回priority_queue首元素的值,但不删除它
q.push(item)//在priority_queue尾压入新元素