版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
循环队列大家都知道,可以解决顺序队列的缺陷:在顺序队列中,当队尾指针已经到数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫做“假溢出”,解决假溢出的途径。
一般的循环列队实现是队列中队列满了就不能增加元素了,今天我们要实现的是一种特殊的循环队列,可以实现无限增加元素,只是在取元素的时候有限制,如果取不到的元素就不会取了。
实现如下:
ByteCirculate.h
#ifndef BYTE_CIRCULATE_H
#define BYTE_CIRCULATE_H
template<class T>
class circulate_queue
{
public:
circulate_queue(const circulate_queue &b) = delete;
circulate_queue& operator= (const circulate_queue &b) = delete;
circulate_queue(int size = 10)
{
_size = size;
_t = new T[_size];
_front = 0;
_end = -1;
}
~circulate_queue()
{
delete[]_t;
_t = nullptr;
}
void Add(T& t)
{
++_end;
if (_end - _front > _size)
{
++_front;
}
int i = _end % _size;
_t[i] = t;
}
T& Get(int index)
{
assert(index >= _front);
assert(index <= _end);
int i = index % _size;
return _t[i];
}
private:
T *_t;
int _size;
int _front;
int _end;
};
#endif
ByteCirculate_test.h
#pragma once
#include "ByteCirculate.h"
namespace Circulate
{
void start_test()
{
circulate_queue<int> *cicula = new circulate_queue<int>(20);
for (int i = 0; i < 1000; i++)
{
cicula->Add(i);
if (i > 10)
std::cout << cicula->Get(i - 10) << endl;
}
}
}
二、用处
当我们需要一个一定大小的缓存区间时可以使用,一直在队尾加元素,在队首取元素
同时队尾线程来的数据可能很快,但是有一定间隔
而队首线程处理数据速度均匀
可以保证线程安全(在保证增加index和取出index有一定间隔时),同时也能传输数据给数据处理线程。