需求
最近在做毕设,关于手势识别的,自己yy了一种算法,实现里面为了方便,需要一种可供我随机访问的大小固定的队列。
矛盾就是,STL里提供的队列只能访问队头,所以就自己实现了一发。
设计
众所周知,要支持随机访问,那么底层就得用数组来实现!我选择了vector(用原始数组也完全没问题,因为细节可以自己控制,不用怕client使用时会越界)。
具体方法是,自己维护一个循环数组,即设立一个头指针,一个尾指针,注意两者的含义要维持在每种操作的前后都不变:
head:表示当前队列里头最旧的一个元素的下标
tail:表示当前队列里,新被插入元素应该放的位置的下标
举个例子,空队列时,head = 0(问:难道不应该是-1?答:特殊的点,没什么,为了写代码方便而已),tail = 0。
插入第一个元素时,根据tail的指示,应该把它放在下标为tail=0的位置!插入后,tail应该变成1了,因为下一个应该放的位置是1!
代码与问题
代码很短,还有一个点可以看的,就是operator []
提供了两种版本,分别返回T&
和const T&
。
为什么呢?
因为有需要啊,比如下面代码里的display函数;还有使用const对象时,如果只有非const版本,则无法调用该函数!
但是两者的代码又是一模一样的,重复不好!
根据《Effective C++》的指示,可以在后者(const)里面调用前者(非const);反过来,则不行,想想为什么?(文末有答案)
代码如下,由于写成了模板,所以声明和实现放在同个文件里头了:
#ifndef __N_RANDOME_QUEUE_H__
#define __N_RANDOME_QUEUE_H__
#include <vector>
using std::vector; // 尽量不要用using namespace std;
template<