C++ 在C+中增加循环队列的容量+;

C++ 在C+中增加循环队列的容量+;,c++,arrays,dynamic,queue,capacity,C++,Arrays,Dynamic,Queue,Capacity,我正在学习队列,并试图编写一种方法,使用动态数组更改循环队列的最大容量。这就是我的代码现在的样子 void ArrayQueue::setCapacity(unsigned newCapacity){ if(newCapacity == 0 || newCapacity < this->getSize()){ throw QueueException("setCapacity()", "invalid new capacity"); } else if(newCapacity

我正在学习队列,并试图编写一种方法,使用动态数组更改循环队列的最大容量。这就是我的代码现在的样子

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;
}
void ArrayQueue::setCapacity(unsigned newCapacity){
如果(newCapacity==0 | | newCapacitygetSize()){
抛出QueueException(“setCapacity()”,“无效的新容量”);
}else if(newCapacity!=this->getSize()){
Item*tempArray=新项目[newCapacity];
对于(无符号i=0;imyCapacity=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 );
阵列队列q5(10);
对于(int i=0;i<10;i++){
q5.追加(i+1);
}
对于(int i=0;i<7;i++){
q5.移除();
}
断言(q5.getCapacity()==10);
断言(q5.getSize()==3);
断言(!q5.isEmpty());
断言(!q5.isFull());
断言(q5.getFirst()==8);
断言(q5.getLast()==10);
//减少容量
q5.设定容量(5);
断言(q5.getCapacity()==5);
断言(q5.getSize()==3);
断言(!q5.isEmpty());
断言(!q5.isFull());
断言(q5.getFirst()==8);
断言(q5.getLast()==10);
我正在传递我的第一组断言,但第二个getFirst断言失败


你能给我一个指向正确方向的指针吗?谢谢。

for(unsigned i=0;i尽我所能理解你的问题,你引用的是其他地方抛出的断言,而不是你发布的代码片段。因为你没有发布你发现有问题的代码,所以不太可能有人会给你答案

for(unsigned i=0; i<newCapacity; i++){
    tempArray[i] = myArray[i];
}
但是,我确实在您发布的代码片段中看到了一个可能的bug。您增加数组大小的代码:

Item * tempArray = new Item[newCapacity];
for(unsigned i=0; i<newCapacity; i++){
    tempArray[i] = myArray[i];
}
Item * oldArray = myArray;
myArray = tempArray;
delete [] oldArray;
Item*tempArray=newitem[newCapacity];

对于(无符号i=0;i我是否可以建议使用以下内容重写此内容:

#include <algorithm>
//...
void ArrayQueue::setCapacity(unsigned newCapacity)
{
    if(newCapacity == 0 || newCapacity < this->getSize()){
        throw QueueException("setCapacity()", "invalid new capacity");
    ArrayQueue tempQ(newCapacity);
    for(unsigned i=0; i< capacity; i++)
        tempQ.append(myArray[i]);
    std::swap(myArray, tempQ.myArray);
    std::swap(capacity, tempQ.capacity);
    std::swap(size, tempQ.size);
}
#包括
//...
void ArrayQueue::setCapacity(未签名的newCapacity)
{
如果(newCapacity==0 | | newCapacitygetSize()){
抛出QueueException(“setCapacity()”,“无效的新容量”);
阵列队列tempQ(新容量);
for(无符号i=0;i
这是如何工作的?好的,我们创建一个具有必要容量的临时
数组队列
。然后我们所做的就是将数据复制到临时对象。然后我们用
this
交换临时对象

完成了

temp对象将随着旧数据而消亡,而
将与新数据一起设置。这是
复制/交换
习惯用法的一种变体。这需要为
阵列队列
提供一个工作的析构函数——一旦有了它,它将变得轻而易举

请注意,如果有更多的成员变量,它们也需要交换。我刚刚交换了您发布的成员变量。我猜您有一个
size
成员变量,因此如果您以不同的名称命名它,那么就用您使用的名称替换它。底线是——用
tempQ
交换所有内容,您应该可以


如果你不知道std::swap做什么,它会按照它说的做。它只是将这两个项相互交换——没有什么特别的,只是方便使用一个函数来做这件事。

你的for循环不正确,
myArray[i]
如果您增加队列,将读取超出范围的内容。如果您的ArrayQueue有一个占用容量的构造函数,那么您编写此函数的过程可能比发布的要简单得多。我刚刚用失败测试的代码更新了我的问题。在失败的断言中,我减少了容量。myFirst和myLast vlaue与原始容量相比,s是正确的,但将容量减半后,它们就不起作用了。myFirst是0,myLast是5,这不应该是这种情况。@TheFaceofBee是否将容量设置为10?
ArrayQueue q5(10)如果是这样的话,我最初的评论仍然有效——你可以用比你写的更简单的方式来编码setCapacity。非常简单,如果不是不可能的话,也很难出错。我会发布一个答案,但需要确认这个构造函数设置了容量…@PaulMcKenzie是的,这确实将容量设置为10.然而,我不知道你想的是什么更简单的方法。我仍然需要分配一个新数组,并将每个元素复制到新数组中,这就是我在这里尝试做的。@下面是我的答案。使用已经编码好的代码,这就是我给出的答案所做的。。。