特殊循环队列(只读增型)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/q943520218/article/details/96686193

      循环队列大家都知道,可以解决顺序队列的缺陷:在顺序队列中,当队尾指针已经到数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫做“假溢出”,解决假溢出的途径。

     一般的循环列队实现是队列中队列满了就不能增加元素了,今天我们要实现的是一种特殊的循环队列,可以实现无限增加元素,只是在取元素的时候有限制,如果取不到的元素就不会取了。

      实现如下:

    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有一定间隔时),同时也能传输数据给数据处理线程。

    

猜你喜欢

转载自blog.csdn.net/q943520218/article/details/96686193