Queue
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より大きい場合は、メモリを増やしてデータを転送します.
Reference
この問題について(Queue), 我々は、より多くの情報をここで見つけました https://velog.io/@sansam41/Queueテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol