C++ 关于动态堆栈的基本问题
我今天学到了动态数组堆栈,教授把模板代码上传到网上。这里是链接,如果你有兴趣看看。但是代码中有一些部分我不理解C++ 关于动态堆栈的基本问题,c++,arrays,dynamic,stack,C++,Arrays,Dynamic,Stack,我今天学到了动态数组堆栈,教授把模板代码上传到网上。这里是链接,如果你有兴趣看看。但是代码中有一些部分我不理解 // I did not know how he comes up with the (3 * _size) void pop() { assert(!is_empty()); _size--; if (_capacity > (3 * _size)) resize(); } 然后在resize()上 //他怎么知道最大容量等于(\u s
// I did not know how he comes up with the (3 * _size)
void pop() {
assert(!is_empty());
_size--;
if (_capacity > (3 * _size))
resize();
}
然后在resize()上
//他怎么知道最大容量等于(\u size*2)
//或动态阵列堆栈最小容量
void resize(){
_容量=最大值(_大小*2,动态_阵列_堆栈_最小容量);
独特的ptr新阵列(新E[_容量]);
对于(int i=0;i<\u size;i++)
新的_数组[i]=_元素[i];
_元素交换(新的_数组);
}
我正在重新键入并重新发布我的答案,查看了您在链接中发布的代码
答案是,教授不知道设置这些值;他们正是他选择的
为了确保我们知道我们的术语:\u capacity
是堆栈可以容纳的容量,而\u size是堆栈当前可以容纳的容量。创建动态堆栈的目标是始终尽量减少浪费的内存量,并尽量减少内存的重新分配量。你用一个交换另一个
您的教授使用以下规则制作此堆栈:
- 从容量为1开始。(这是定义的
动态阵列堆栈最小容量
值。)
- 如果容量是该尺寸的3倍或更高,请将其调整为该尺寸的2倍
- 如果大小=容量,请将容量调整为大小的2倍
动态阵列堆栈最小容量和2x大小,因为大小最初为0。如果没有最小值,则容量也将为0,这将导致错误
将容量增加一倍也是任意的。如果你愿意的话,可以做100倍的尺寸。这意味着您将更少地调整大小,但会浪费大量内存。2可能是一个很好的数字来平衡调整大小和浪费
触发缩小阵列的阈值也是任意的。通过将其设置为3倍,可以在不必每次调整大小的情况下为弹出元素留出大量空间。这有点浪费内存,但也不算太糟
当您使用这些概念时,您可以根据需要设置数字。除了最小值设置为1之外,这些都是非常好的标准数字
希望这能有所帮助。这些数字很可能只是好的选择,但却是随意的选择。你为什么不问问他?我会的,但是因为他下课后发了代码,所以我要到下周才能见到他。这就是为什么我把它带到这里,问你们关于它的问题。谢谢,这帮助了很多,比我的教授在一个多小时的讲座中说的更清楚,更多的信息!!!!
//how does he know that the max capacity will be equal to either (_size * 2)
// or DYNAMIC_ARRAYED_STACK_MIN_CAPACITY
void resize() {
_capacity = max(_size * 2, DYNAMIC_ARRAYED_STACK_MIN_CAPACITY);
unique_ptr<E[]> new_array(new E[_capacity]);
for (int i = 0; i < _size; i++)
new_array[i] = _elements[i];
_elements.swap(new_array);
}