我想使用C++模板制作一个通用堆栈。堆栈推送方法的原型由以下公式给出: Void push(t * ptr) 其中,t是模板参数。现在指针ptr可能指向一个整数或整数数组,它可能指向单个字符或字符数组,它可能指向单个双数或双精度数组等。 我想要的是,我想要在push方法中分配内存,如果ptr指向一个整数,那么我需要分配内存相对于整数的大小,如果ptr指向整数数组,然后我需要根据大小分配内存阵列。同样对于其他基本数据类型 我的问题是如何确定这个pointe ptr是指向一个数组还是一个简单的变量。如果不可能发现指针指向一个数组或一个简单的变量,则建议一种技术,通过该技术我可以编写该堆栈的推送方法。字符堆栈,字符串堆栈,整数堆栈,整数数组堆栈等
1
A
回答
0
一旦数组“衰减”到一个指针,就不可能推导出一个T *所指向的数组的大小。
考虑让你的栈类型取一对指针,一个指向数组中的第一个元素,另一个指向数组中的最后一个元素。或者,有一个重载的push方法 - 一个采用单个指针,另一个采用单个指针和size_t告诉你指向了多少个对象。
而我有点困惑,为什么你有一个T *作为参数。为什么不采取T,就像对stl容器上的大多数“添加”操作一样?当你在这里时,你知道std :: stack存在吗(它是stl中的“容器适配器”)?即使你有很好的理由来重新实现它,寻找STL的API设计实例也是一个好主意。
2
你提出的建议不是一个好主意 - 它不可能在C++中检测指针是指向单个实例还是数组,但是这两者需要区别对待。
就个人而言,我会使用属于C++标准的std :: stack适配器。
0
您的编译器已经负责分配和复制。如果你像这样定义推送:
push(T item)
编译器会为你复制项目,你可以将它填充到你的内部存储中。
另外,int和int []是两个不同的类型。如果你想专门做一个堆栈可以接受的T [],你可以做推过载:
push(T[] items)
我假设你想要这个功能,这样就可以作为单独的项目推这些压入堆栈,不是因为你想要一个异构容器。在这个推动中,您可以遍历数组中的每个项目并将其存储到内部存储中。
0
您可以使用模板的偏特喜欢这个数组的堆栈:
template <typename T>
class Stack <T*>
{
//other stuff
};
但我不知道你的编译器支持与否,因为部分模板特化在VC++ 7.0不支持,以后的版本可能有它的支持。
我尽我所知linux gnu 8.2 GNU C++支持它。
相关问题
- 1. 将整数推入堆栈
- 2. JVM - 堆栈和堆栈
- 3. 希望堆栈堆栈?
- 4. 堆栈或堆
- 5. Java堆栈/巢数
- 6. 堆栈
- 7. 堆栈
- 8. Java-数据结构堆栈:从用户输入的堆栈打印出整数
- 9. C堆栈数组实现
- 10. 堆栈和数组列表
- 11. 堆栈的数组实现
- 12. 堆栈搜索导致堆栈溢出
- 13. 堆栈= java.lang.StackOverflowError的:堆栈大小8MB
- 14. getaddrinfo addrinfo导致堆栈或堆栈
- 15. Python堆栈为堆栈格式
- 16. 堆栈帧和堆栈指针
- 17. 堆栈或堆栈分配不正确
- 18. 调整堆栈视图
- 19. 堆栈在CSS表整列
- 20. Java - 堆栈 - 检查堆栈的两个数字是否相等100
- 21. 奇怪的堆栈/字符串行为
- 22. 堆栈上字符串的分配
- 23. 倒车字符串使用堆栈
- 24. 使用堆栈反转字符串
- 25. 在堆栈中按下字符串?
- 26. 将堆栈转换为字符串
- 27. 反转从堆栈中的字符串
- 28. (C++)使用堆栈反转字符串?
- 29. 整数的有界堆栈C++
- 30. Java堆栈组件
你想让你的堆栈包含推送它的副本吗?或者将获得传递给它的指针的所有权? – 2009-12-26 19:38:45
是的是的确切 – 2009-12-26 20:12:53
我想在堆栈中有东西的副本 – 2009-12-26 20:16:33