增加C++循环队列的容量
Increasing capacity of circular queue in C++
>我正在学习队列,并尝试编写一种方法来使用动态数组更改循环队列的最大容量。 这就是我的代码现在的样子。
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
.
做。
temp 对象随旧数据一起死亡,this
用新数据设置。 这是copy/swap
成语的变体。 这需要一个用于ArrayQueue
的工作析构函数 - 一旦你有了它,那么它就变成了小菜一碟。
请注意,如果存在更多成员变量,则还需要交换它们。 我刚刚交换了您发布的那些。 我猜你有一个size
成员变量,所以如果你以不同的方式命名它,那么用你使用的名称替换它。 底线 - 用tempQ
交换所有东西,你应该没问题。
如果你不知道std::swap
做什么,它就会按照它所说的去做。 它只是将两个项目相互交换 - 没有什么特别的,只是方便使用一个函数来做到这一点。
for(unsigned i=0; i<newCapacity; i++){
tempArray[i] = myArray[i];
}
如果新容量更大,则将使用无效索引访问 myArray
尽我所能弄清楚你的问题,你引用的断言在其他地方,而不是你发布的代码片段。由于您没有发布您认为有问题的代码,因此不太可能有人会给您答案。
但是,我确实在您发布的代码片段中看到了一个可能的错误。增加数组大小的代码:
Item * tempArray = new Item[newCapacity];
for(unsigned i=0; i<newCapacity; i++){
tempArray[i] = myArray[i];
}
Item * oldArray = myArray;
myArray = tempArray;
delete [] oldArray;
例如,假设 myArray 的旧大小是 20,而您将其增加到 40。
您将分配一个新的 40 个元素的 tempArray。
然后继续将前 40 个元素从 myArray 复制到 tempArray。
未定义的行为。
- boost::进程间消息队列引发错误
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Android NDK传感器向事件队列报告奇怪的间隔
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 在一个读写器队列中,我可以用volatile替换原子吗
- 为什么我的多线程作业队列崩溃
- 具有非整数边容量的最大流量的Dinic算法
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将stl字符串缩小到小于15个字符的容量
- 使用"Task"函数指针队列定义作业管理器
- 在c++队列中使用pop和visit实现线程安全
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 英特尔 TBB 计算图:如何指定节点的输入队列容量
- 过度填充堆栈和队列容量(C )
- 增加C++循环队列的容量
- 使用容量受限的队列按顺序列出字符串
- 一旦满足指定容量,覆盖优先级队列末尾的元素