unsigned mySize; // number of items I contain
unsigned myCapacity; // how many items I can store
unsigned myFirst; // index of oldest item (if any)
unsigned myLast; // index of next available spot for append (if any)
Item* myArray; // dynamic array of items
Я создаю класс очереди на основе динамического массива, и мне нужно создать метод, который изменяет количество элементов, которые может содержать очередь. Мне нужно, чтобы «myLast» оставался точным после изменения емкости, особенно в очереди, в которой уже были сняты элементы с фронта.
void ArrayQueue<Item>::setCapacity(unsigned cap) {
if (cap < getSize() || cap == 0){
throw QueueException("setCapacity()", "New capacity must be greater than size");
} else {
Item * nq = new Item[cap];
for (unsigned i = 0; i < cap; i++){
nq[i] = myArray[i];
}
delete [] myArray;
myArray = nq;
myCapacity = cap;
//what do I put here to make myFirst and myLast be correct for the new capcacity?
}
}
Кто-нибудь может объяснить, как это сделать?
Ничто — ни myFirst, ни myLast не изменятся с тем, что у вас есть — если вы используете циклическую очередь (и я уверен, что вы есть), и в этом случае вы не можете просто скопировать исходный массив поверх нового массива. Если вы просто скопируете старый массив поверх нового, любые обернутые записи окажутся не на своем месте. Вы должны справиться с возможностью того, что это обернулось вокруг.
И у вас есть проблема с вашим циклом:
for (unsigned i = 0; i < cap; i++){
nq[i] = myArray[i];
}
Он выйдет из конца myArray, если cap
больше, чем myCapacity (например, размер myArray).
Вы можете изменить свой контейнер в очереди, если хотите.
std::queue<int,std::list<int>> myQueue
как это…