Queue


Queue

  • 初発売(FIFO)
  • Listを使用したQueue
    template<typename T>
    class ListQueue
    {
    public:
    	void push(const T& value)
    	{
    		_container.push_back(value);
    	}
    	void pop()
    	{
        	//_container.erase(_container.begin());
    		_container.pop_front();
    	}
    
    	T& front()
    	{
    		return _container.front();
    	}
    
    	bool empty()
    	{
    		return _container.empty();
    	}
    	int size()
    	{
    		return _container.size();
    	}
    private:
    	//vector<T> _container;
    	list<T> _container;
    };

  • ListによるQueueはVectorとは異なり,中間挿入/削除効率が高いという利点がある.(List Queue)

  • Vectorを使用してQueueを実装する場合は、ループ方式を使用して実装します.
  • 循環配列を使用したキュー
    template<typename T>
    
    class ArrayQueue
    {
    public:
    	ArrayQueue()
    	{
    		_container.resize(100);
    	}
    
    	void push(const T& value)
    	{
    		// 다 찼는지 체크
    		if (_size == _container.size())
    		{
    			// 증설 작업
    			int newSize = max(1, _size * 2);
    			vector<T> newData;
    			newData.resize(newSize);
    			// 데이터 복사
    			for (int i = 0;i < _size;i++)
    			{
    				int index = (_front + i) % _container.size();
    				newData[i] = _container[index];
    			}
    		}
    		_container[_back] = value;
    		_back = (_back + 1) % _container.size();
    		size++;
    	}
    	void pop()
    	{
    		_front = (_front + 1) % _container.size();
    		_size--;
    	}
    
    	T& front()
    	{
    		return _container[_front];
    	}
    
    
    
    	bool empty()
    	{
    		return _size == 0;
    	}
    	int size()
    	{
    		return _size;
    	}
    private:
    	vector<T> _container;
    	int _front = 0;
    	int _back = 0;
    	int _size = 0;
    };

  • vectorはlistと異なり,中間挿入/削除効率が低下するため,異なる方式で実現する必要がある.

  • vectorのランダムアクセスを使用して、前後のインデックスを任意に指定して格納します.

  • sizeが最初に指定したsizeより大きい場合は、メモリを増やしてデータを転送します.