このコードだと引数なしのインスタンス化されたときに、
501個分のメモリを確保するんですよね。リストで一つずつ動的にメモリを確保して要素を足していくほうが、動的なイメージは強いのですが、最初に501個メモリを確保するなら動的らしくないと感じてしまったのですが、
もちろんデータ構造なので場合によって使い分けるのは当然ですが、
配列で実装した円形リストって、かなり使われているものなのでしょうか?
あと別の話になるのですが、
QueueType<ItemType>::QueueType(int maxSize){
// parameterized constructor
this->maxSize = maxSize+1;
front = maxSize-1;
rear = maxSize-1;
items = new ItemType[this->maxSize];
}
では引数maxsizeに1を足してから、front,rearや動的メモリ確保をしていますが、maxsizeに1を足すという動作が無駄に感じて、lengthを引数にしたほうが分かりやすくないですか?
皆さまのご意見を伺いたいです。
よろしくお願いします
コード #ifndef QUEUETYPE_H #define QUEUETYPE_H class FullQueue{}; // Exception class used by Enqueue when queue is full. class EmptyQueue{}; // Exception class used by Dequeue when queue is empty. template<class ItemType> class QueueType{ private: int maxSize; int front; int rear; ItemType *items; public: QueueType(int maxSize); QueueType(); ~QueueType(); void MakeEmpty(); bool IsEmpty() const; bool IsFull() const; void Enqueue(ItemType item); void Dequeue(ItemType& item); }; #endif template<class ItemType> QueueType<ItemType>::QueueType(int maxSize){ // parameterized constructor this->maxSize = maxSize+1; front = maxSize-1; rear = maxSize-1; items = new ItemType[this->maxSize]; } template<class ItemType> QueueType<ItemType>::QueueType(){ // default constructor this->maxSize = 501; front = maxSize-1; rear = maxSize-1; items = new ItemType[this->maxSize]; } template<class ItemType> QueueType<ItemType>::~QueueType(){ // destructor delete [] items; } template<class ItemType> void QueueType<ItemType>::MakeEmpty(){ front = maxSize-1; rear = maxSize-1; } template<class ItemType> bool QueueType<ItemType>::IsEmpty() const{ return (rear == front); } template<class ItemType> bool QueueType<ItemType>::IsFull() const{ return ( (rear+1) % maxSize == front ); } template<class ItemType> void QueueType<ItemType>::Enqueue(ItemType newItem){ if (IsFull()) throw FullQueue(); else { rear = (rear+1) % maxSize; items[rear] = newItem; } } template<class ItemType> void QueueType<ItemType>::Dequeue(ItemType& item){ if(IsEmpty()) throw EmptyQueue(); else{ front = (front+1) % maxSize; item = items[front]; } }
回答3件
あなたの回答
tips
プレビュー