我使用了许多编程语言,它们都有类似.push()或.append()的东西来将对象添加到动态数组的末尾。现在,我学了一些C++,并注意到它不支持这一点,但我必须实现一个手动完成此操作的函数,此函数创建一个新的临时数组,该数组比旧数组长一个元素,循环并复制每个元素,添加新对象,删除旧数组,并将临时数组复制到旧数组中。我已经使用过的允许.push()这样的函数在汇编级做同样的事情吗?
.push()
.append()
ctehm74n1#
在C中,我们也有自己进行内存管理的结构:std::vector<>。建议在适当的时候在普通数组上使用std::vector<>。std::vector<>维护一个缓冲区,并且只在必要的时候(即当缓冲区太小而不能容纳新插入的元素时)才调整大小+移动;那么它通常膨胀到两倍或类似的程度。在其他语言中,你也需要实现某种内存管理。然而,这种大小调整是否必要并不简单:因为大多数脚本语言实际上都是在低级语言中实现的,通常是C/C/C--。因此,std::vector<>(甚至std::map<>)可能会在后台使用。然而,最终,必须有人实现resizing 1,因为内存通常被视为一维数组,从中分配;您不一定可以无限地扩展分配。1注意:理论上,在某些体系结构上,可以将此委托给虚拟内存管理,并使用段寄存器作为指针,索引寄存器作为偏移量,并让分页将segment:index与物理地址相关联;但是现在已经很少用了。
std::vector<>
std::map<>
goucqfw62#
是的,他们做的。例如python list(是数组,而不是列表)做的完全一样。注意事项:你不需要自己实现它,这就是C++中STL的作用,动态数组的相关数据结构是std::vector,除了std::vector在增加数组方面更聪明之外,增加一个以上的元素,这样就不必每次推送都复制以前的所有数据。事实上,每次推送的摊销成本为O(1)。如果你知道你有多少数据,那么最好还是从一开始就分配合适的空间。
std::vector
O(1)
2条答案
按热度按时间ctehm74n1#
在C中,我们也有自己进行内存管理的结构:
std::vector<>
。建议在适当的时候在普通数组上使用std::vector<>
。std::vector<>
维护一个缓冲区,并且只在必要的时候(即当缓冲区太小而不能容纳新插入的元素时)才调整大小+移动;那么它通常膨胀到两倍或类似的程度。在其他语言中,你也需要实现某种内存管理。然而,这种大小调整是否必要并不简单:因为大多数脚本语言实际上都是在低级语言中实现的,通常是C/C/C--。因此,
std::vector<>
(甚至std::map<>
)可能会在后台使用。然而,最终,必须有人实现resizing 1,因为内存通常被视为一维数组,从中分配;您不一定可以无限地扩展分配。1注意:理论上,在某些体系结构上,可以将此委托给虚拟内存管理,并使用段寄存器作为指针,索引寄存器作为偏移量,并让分页将segment:index与物理地址相关联;但是现在已经很少用了。
goucqfw62#
是的,他们做的。例如python list(是数组,而不是列表)做的完全一样。
注意事项:你不需要自己实现它,这就是C++中STL的作用,动态数组的相关数据结构是
std::vector
,除了std::vector
在增加数组方面更聪明之外,增加一个以上的元素,这样就不必每次推送都复制以前的所有数据。事实上,每次推送的摊销成本为O(1)
。如果你知道你有多少数据,那么最好还是从一开始就分配合适的空间。