0
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?
       }
    }

谁能解释如何做到这一点?

4

2 回答 2

0

什么都没有—— myFirst 和 myLast 都不会随着你所拥有的而改变——除非你使用的是循环队列(我敢打赌你是),在这种情况下,你不能只将原始数组复制到新数组上。如果您只是将旧数组复制到新数组上,则任何环绕的条目最终都会不合适。您需要处理它已经缠绕的可能性。

你的 for 循环有问题:

for (unsigned i = 0; i < cap; i++){
    nq[i] = myArray[i];
}

如果cap大于 myCapacity(例如 myArray 的大小),它将在 myArray 的末尾运行。

于 2014-04-23T18:20:38.213 回答
0

如果您愿意,您可以更改队列中的容器。

 std::queue<int,std::list<int>> myQueue

像这样...

于 2014-04-24T16:58:46.367 回答