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倍
你必须有一个最小容量。一些实现(如Microsoft.NET标准)实际上将最小值设置为10左右,然后从那里调整大小。通过设置稍大一点的值,可以避免为前几个条目调整数组的大小,但在本例中(可能是为了让您了解逻辑的工作原理),它被设置为1。这意味着,只要按下一个元素,就必须调整大小。您必须具有最大
动态阵列堆栈最小容量
和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);
}