关于DynamicArrayStack的基本问题

时间:2013-10-03 21:17:25

标签: c++ arrays dynamic stack

我今天学会了动态阵列堆栈,教授在线上传模板代码。如果您有兴趣查看http://ideone.com/oXe2t1,可以使用以下链接。但是代码中有一些我不理解的部分。

// I did not know how he comes up with the (3 * _size)
void pop() {
    assert(!is_empty());
    _size--;
    if (_capacity > (3 * _size))
        resize();
}

然后在resize()

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

1 个答案:

答案 0 :(得分:2)

我正在重新输入并重新发布我的答案,看了你在链接中发布的代码。

答案是,教授没有知道来设定这些值;他们就是他所选择的。

只是为了确保我们知道我们的术语:_capacity可以保持多少,而_size是堆栈当前持有多少。创建动态堆栈的目标是始终尝试最小化浪费的内存量并最小化内存的重新分配量。你交易一个,换取另一个。

你的教授用以下规则制作了这个堆栈:

  • 以容量1开头。(这是定义的DYNAMIC_ARRAYED_STACK_MIN_CAPACITY值。)
  • 如果容量是该尺寸的3倍或更高,请将其尺寸调整为尺寸的2倍。
  • 如果尺寸=容量,请将容量调整为尺寸的2倍。

您必须拥有最低容量。某些实现(如Microsoft .NET标准)实际上将最小值设置为大约10,然后从那里调整大小。通过设置稍大的值,您可以避免为前几个条目调整数组大小,但在这个实例中(可能因此您可以看到逻辑如何工作),它被设置为1.这意味着只要您按下一个元素,你必须调整大小。您必须具有最大DYNAMIC_ARRAYED_STACK_MIN_CAPACITY和2x大小,因为大小最初为0.如果您没有最小值,则您的容量也将为0,这将导致错误。

使容量增加一倍也是任意的。如果您愿意,可以将它制作100倍的尺寸。这意味着你可以做更少的调整 - 但你会浪费大量的内存。 2可能是一个非常好的数字来平衡调整大小与浪费。

触发收缩阵列的阈值也是任意的。通过将其设置为3x,可以为弹出元素留出大量空间,而无需每次都调整大小。这有点浪费内存,但也不算太糟糕。

当您使用这些概念时,您可以将数字设置为您需要的任何数字。除了将MIN设置为1之外,这些都是非常好的标准数字。

希望这有帮助。