我正在尝试写一个基于数组的堆栈,它可以动态地重新分配。我遇到的主要问题是如何实现调整数组大小的过程。在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的实现,但是……它太大了=P
到目前为止,我已经制作了这个Vector.ads,有人能帮上忙吗?
发布于 2011-12-11 23:13:32
假设您知道如何为堆栈初始分配(空)数组。
当您需要重新分配到更大的数组时,将其分配到一个本地访问变量中,类似于C++示例中的"st“。然后循环遍历现有的完整数组,将其元素复制到新分配的数组中。
Free,使用未检查释放的实例化旧数组--这是Vector记录中的Elements字段。然后将Elements字段设置为包含新分配的数组的变量。
从本质上讲,它与您的memset示例非常相似,只是您不需要使用sizeof(),并且您使用了memset/ C++的一个复制循环。
发布于 2011-12-13 04:32:04
好了,案子解决了。我已经完成了我的Vector类(实际上是在数组上构建的堆栈)。感谢大家的帮助。
以下是我的代码,仅供后人参考。希望有人能从中学到一些东西。Code -> https://gist.github.com/496a50bc7f5cd93f8d91
如果你想看一下,找到一些值得修改的地方,只需评论即可。;D
发布于 2011-12-12 03:32:51
如果您使用Ada.Containers.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的可用性。
https://stackoverflow.com/questions/8463278
复制相似问题