当然,每个程序员都听说过实现说带有数组的堆栈有其缺点,其中最大的缺点是固定大小。但是在学习了realloc函数之后,似乎存在一种方法来实现这种ADT和其他具有动态变化的数组的ADT,如下所示:
首先,我将使用malloc函数动态分配数组的第一个成员。然后,当我想添加另一个成员时,我要做的就是重新分配大小以增加它,并使用array [n + 1] = new项添加它。第三,如果要删除项目,可以再次使用realloc函数缩小动态数组。
好处是令人惊讶的(至少从我的角度来看),因为您将拥有例如具有动态分配存储和常规数组(例如随机访问和易于操作等)的好处的堆栈。
老实说,我真的不能相信这是可行的,因为如果是那样的话,我为什么不在任何教科书或互联网上读到它(我不可能在这里做出某种发明或以此类推。其实还是个新手)。
所以肯定有什么不对劲的地方,我已经准备好听听:)
一个关键的问题realloc
是它可能会或可能不会将现有内存内容移至新缓冲区,但是如果它决定这样做,则将使用逐字节复制(ala memcpy
)。
通常,应使用C ++对象的move或copy构造函数来移动或复制C ++对象,并且要释放的内存中的任何对象都应调用其析构函数。在malloc
/ realloc
/free
功能一般没有任何“挂钩”,让来电管理对象的复制,所以它是不切实际的C ++库使用realloc
,用于存储任意类型的对象缓冲区。
也就是说,realloc
可以用于memcpy
可以接受样式移动的非常简单的对象。人们确实使用hack容器类realloc
-仅AFAIK这样的容器并没有流行到足以将其放入主要库中,这可能是因为性能收益比您期望的要少(这取决于realloc
可以使用的时间比例)调整大小,例如在调整大小时vector
具有reserve
内在的容量加倍,这往往会限制复制成本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句