关于 DynamicArrayStack 的基本问题
basic questions about DynamicArrayStack
我今天知道他们动态数组堆栈,教授在线上传模板代码。如果您有兴趣查看,这里是链接 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();
}
然后在调整大小((
//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);
}
我正在重新输入并重新发布我的答案,查看了您在链接中发布的代码。
答案是,教授不知道设定这些值;它们只是他选择的。
只是为了确保我们知道我们的条款:_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 之外,这些都是非常好的标准数字。
希望这有帮助。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题