为什么插入时动态分配的数组大小是初始数组的 2*大小,而不是大小+1?
Why is dynamicaly allocated array's size upon insertion 2*size of the initial array, rather than size+1?
我是一名计算机科学专业的学生,我一直在尝试更深入地理解stl::vector。我发现,向量实际上是动态数组,这意味着在插入/删除时,如果需要,数组的大小会调整。
一位朋友告诉我,当数组重新分配时,例如在插入时,它不会创建一个大小为 [original+1] 的新数组,而是创建一个大小为 [2*original] 的新数组。
在插入/删除某些内容时只添加(或减去)一个数组字段,而不是创建一个两倍大的数组,让许多索引未使用,这不是更好吗?
我认为这样做的原因是,也许每隔一段时间而不是每次插入/删除才创建一个两倍大的数组或重新定位数组具有更好的时间复杂性,但是例如,如果我有一个大对象的数组,即使这样重新分配一个大小是原始数组的两倍,也会更好吗? 还是使用尺寸+1?
感谢您的回复。
原因是数学。
具有您描述的重新分配策略(或任何指数增长,就此而言,因子无关紧要)的容器保证在末尾插入元素的渐近平均恒定成本,即插入 n 个元素的成本,全部除以 n,收敛到一个常量值,因为 n 变大。这是因为随着 n 的增长,分配变得越来越罕见。
如果每次插入时总是将阵列增加 1,则每次插入都会产生线性成本。
请注意,std::vector
不是C++的本机数组类型意义上的"动态分配数组"new T[N]
;相反,它将内存分配与对象构造分开。呈指数级增长的是std::vector
分配的内存。构造对象的数量始终精确地与容器的当前大小一致。
相关文章:
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 在C++中传递给函数时,为什么要指定数组大小作为参数
- C++编程从外部文本文件定义数组大小
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 从用户那里获取数组大小的值
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- C++中数组大小未知的指针转换
- 如何在子类中重新定义数组大小?
- 为什么我的 cpp 数组大小是 4 的倍数?
- 尝试将数组大小调整为 -1
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- 数组大小由输入文件中的行数定义
- Sizeof返回的是指针大小,而不是数组大小.有其他方法可以找到尺寸吗
- 数组大小超过函数大小(C++)
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 根据模板值确定的静态数组大小
- 如何从枚举类值中指定模板函数参数中的数组大小?
- 当删除 [] 指针工作时,为什么无法获得指向的数组大小?
- wchar_t wcscpy_s的数组大小问题