计算机科学中,动态数组dynamic array),也称为:可增长数组growable array)、可调大小数组 resizable array)、动态表格 dynamic table)、可变化数组mutable array)或数组列表array list),是一种随机访问的、大小可变的列表数据结构,它允许增加或移除元素。在很多现代主流编程语言中,它是通过标准库而提供的。动态数组克服了静态数组的限制,静态数组有着需要在内存分配时指定的固定容量。

使用几何扩张将一些值插入到动态数组的末端。灰白单元格指示留作扩张的空间。多数插入是快速的(常数时间),而某些插入因为需要内存分配而缓慢(Θ(n)时间,标示了乌龟)。展示了最终数组的“逻辑大小”和“容量”。

动态数组与动态分配的数组或可变长数组不是一种东西,可变长数组的大小是在分配这个数组的时候固定的,然而动态数组也可以使用这种固定大小的数组作为后端[1]

语言支持

编辑

C++std::vector英语Sequence container (C++)Ruststd::vec::Vec是动态数组的实现,还有ArrayList类,提供它的有Java API[2][3]:236.NET框架[4][5]:22

.NET框架版本2.0提供的泛型List<>类也是通过动态数组实现的。SmalltalkOrderedCollection时具有动态的开始与结束索引的动态数组,这使得移除第一元素也只需要O(1)时间。

Pythonlist数据类型实现了动态数组,其增长模式是:0, 4, 8, 16, 24, 32, 40, 52, 64, 76, ...,参见在github.com的listobject.c[6]

DelphiD在语言核心实现了动态数组。

AdaAda.Containers.Vectors泛型包提供了针对给定子类型的动态数组。

很多脚本语言比如PerlRuby提供了动态数组作为内建原始数据类型

一些跨平台框架为C语言提供动态数组实现,包括Core Foundation英语Core Foundation中的CFArrayCFMutableArray,和GLib中的GArrayGPtrArray

Common Lisp通过允许配置内建array类型为“可调整的”和通过“填充指针”指定插入位置,提供了对可变大小向量的初步支持。

参见

编辑

引用

编辑
  1. ^ See, for example, the source code of java.util.ArrayList class from OpenJDK 6.
  2. ^ Javadoc on ArrayList
  3. ^ Bloch, Joshua. "Effective Java: Programming Language Guide" third. Addison-Wesley. 2018. ISBN 978-0134685991. 
  4. ^ ArrayList Class
  5. ^ Skeet, Jon. C# in Depth. Manning. ISBN 978-1617294532. 
  6. ^ listobject.c (github.com)

外部链接

编辑