我想使用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. 大整數堆棧溢出
- 3. 將整數推入堆棧
- 4. 全堆棧,堆棧交換等,什麼是堆棧?
- 5. JVM - 堆棧和堆棧
- 6. 希望堆棧堆棧?
- 7. 堆棧或堆
- 8. 實施堆棧:推出的字符在堆棧中爲空
- 9. Java堆棧/巢數
- 10. 堆棧
- 11. 堆棧
- 12. 堆棧
- 13. OOP和堆/堆棧
- 14. 塊,堆棧和堆
- 15. 可逆字堆棧
- 16. Java-數據結構堆棧:從用戶輸入的堆棧打印出整數
- 17. 堆棧和數組列表
- 18. 堆棧的數組實現
- 19. C堆棧數組實現
- 20. 堆棧,堆棧泛化算法
- 21. 矢量,堆棧與堆棧(C++)
- 22. cin是堆棧還是堆棧?
- 23. 堆棧在java中使用堆棧
- 24. 堆棧幀和堆棧指針
- 25. 堆棧= java.lang.StackOverflowError的:堆棧大小8MB
- 26. 堆棧溢出調用堆棧#timememoryfunctionlocation 10.0000143728
- 27. 從堆棧轉換堆棧arrayList
- 28. 中斷堆棧的堆棧指針
- 29. 堆棧搜索導致堆棧溢出
- 30. 堆棧溢出堆棧溢出
你想讓你的堆棧包含推送它的副本嗎?或者將獲得傳遞給它的指針的所有權? – 2009-12-26 19:38:45
是的是的確切 – 2009-12-26 20:12:53
我想在堆棧中有東西的副本 – 2009-12-26 20:16:33