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

标签 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 != 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 );

我正在传递我的第一组断言,但第二组 getFirst 断言失败了。

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

最佳答案

我可以建议使用以下内容重写它吗:

#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);
}

这是如何运作的?那么,我们创建一个具有必要容量的临时 ArrayQueue。然后我们所做的就是将数据复制到临时对象中。之后,我们用 this 换出临时对象。

完成。

临时对象与旧数据一起消失,this 被设置为新数据。这是 copy/swap 习语的变体。这需要一个适用于 ArrayQueue 的有效析构函数——一旦有了它,它就变得小菜一碟了。

注意,如果成员变量较多,也需要进行交换。我只是交换了你发布的那些。我猜你有一个 size 成员变量,所以如果你以不同的方式命名它,然后用你使用的名称替换它。底线 -- 用 tempQ 交换所有内容,你应该没问题。

如果您不知道 std::swap 是做什么的,它会按照它说的做。它只是将两个项目相互交换——没什么特别的,只是使用函数来执行此操作很方便。

关于c++ - 在 C++ 中增加循环队列的容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26953143/

相关文章:

c++ - 将 boost::multi precision::mpq_rational 舍入到最接近的整数

c++ - 如何在 vector C++ 中打印元素

javascript - 如何将数组分割成 block ,但让它一个接一个地填充每个数组

c - 如何在汇编中处理二维数组

JAVASCRIPT - 动态创建 Div 不会采用给定的样式(宽度和高度)

c++ - 单元测试中的失败默认参数

c++ - 我可以将operator ==虚拟化以实现平等吗?

c++ - 无法编译opencv: undefined reference 未读等

javascript - 切换工具提示文本

html - 使用 aurelia 模板引擎增强动态添加 html