キューについて学んでおり、動的配列を使用して循環キューの最大容量を変更するメソッドを作成しようとしています。これが私のコードが今どのように見えるかです。
void ArrayQueue::setCapacity(unsigned newCapacity){
if(newCapacity == 0 || newCapacity < this->getSize()){
throw QueueException("setCapacity()", "invalid new capacity");
} else if(newCapacity != this->getSize()){
Item * tempArray = new Item[newCapacity];
for(unsigned i=0; i<newCapacity; i++){
tempArray[i] = myArray[i];
}
Item * oldArray = myArray;
myArray = tempArray;
delete [] oldArray;
}
this->myCapacity = newCapacity;
}
ただし、容量を減らすと、アサーションで myFirst 値と myLast 値を取得できません。エントリがラップアラウンドした場合に対処するためにコードを記述する必要があることは理解していますが、その方法について混乱しています。
私が合格しようとしているテストには、次のようなコードがあります。
ArrayQueue q5(10);
for (int i = 0; i < 10; i++){
q5.append(i+1);
}
for (int i = 0; i < 7; i++){
q5.remove();
}
assert( q5.getCapacity() == 10 );
assert( q5.getSize() == 3 );
assert( !q5.isEmpty() );
assert( !q5.isFull() );
assert( q5.getFirst() == 8 );
assert( q5.getLast() == 10 );
//reduce the capacity
q5.setCapacity(5);
assert( q5.getCapacity() == 5 );
assert( q5.getSize() == 3 );
assert( !q5.isEmpty() );
assert( !q5.isFull() );
assert( q5.getFirst() == 8 );
assert( q5.getLast() == 10 );
最初の一連のアサーションはパスしていますが、2 番目の getFirst アサーションは失敗しています。
正しい方向へのポインタを教えていただけますか?ありがとう。