我正在尝试编写基于数组的堆栈,可以动态重新分配。我遇到的主要问题是如何实现调整数组大小的过程。在C ++中它可能看起来像这样:
template<class T, int incr>
void Vector<T, incr>::inflate(int increase) {
const int tsz = sizeof(T*);
T** st = new T*[quantity + increase];
memset(st, 0, (quantity + increase) * tsz);
memcpy(st, storage, quantity * tsz);
quantity += increase;
delete []storage;
storage = st;
}
其中int quantity;
和T** storage;
在私有部分声明。
如果有人可以与我分享一些样品,我会非常感激。我试着看看Ada.Containers.Vectors的实现,但是唉...这是对big = P
到目前为止,我已经做到了Vector.ads任何人都可以帮忙吗?
答案 0 :(得分:6)
好的,案件已经解决了。我已经完成了我的Vector类(它实际上是一个数组的堆栈构建)。感谢大家的帮助。
为了后代,这里是我的代码。希望有人能从中学到一些东西。 代码 - &gt; https://gist.github.com/496a50bc7f5cd93f8d91
如果你想看看并找到值得改变的东西,只需评论。 ; d
答案 1 :(得分:5)
如果您选择Ada.Containers.Vectors
,Rationale for Ada 2005: §8.2 Lists and vectors会有一个有用的讨论。基本上,您使用Index_Type
和Element_Type
package Container is new Containers.Vectors (Natural, T);
然后声明一个具有新类型的变量:
Stack : Container.Vector;
然后Push
过程变为Stack.Append
,Pop
函数返回Stack.Last_Element
。请注意prefixed notation的可用性。
答案 2 :(得分:4)
据推测,您知道如何最初为堆栈分配(空)数组。
当您需要重新分配到更大的数组时,将其分配到本地访问变量,类似于C ++示例中的“st”。然后循环遍历现有的完整数组,将其元素复制到新分配的元素中。
免费,使用Unchecked Deallocation的实例化,旧数组 - 这是Vector记录中的Elements字段。然后将Elements字段设置为包含新分配的数组的变量。
基本上,它紧跟你的C ++示例,只是你不需要使用sizeof(),并使用memset / memcpy的副本循环。