實現stack 和queue--模板類、容器介面卡
阿新 • • 發佈:2019-02-13
實現stack:
在實現棧的時候,我們都是在順序表上的特定位置插入刪除資料,那麼在學習了模板類和容器介面卡的概念後,就可以很容易的實現棧了。
關於模板:https://blog.csdn.net/weixin_40417029/article/details/80345464
//stack #pragma once #include <iostream> #include "./vector.h" #include "vector.cpp" //為什麼要包含vector.cpp檔案呢? using namespace std; template <class T, class Container=Vector<T> > class Stack { public: void Push(T x) { _con.PushBack(x); return; } void Pop() { _con.PopBack(); return; } const T& Top() { return _con.Back(); } int Empty() { return _con.Size() == 0 ? 1 : 0; } protected: Container _con; };
上面是我利用vector類實現的stack類,我為什麼要在該檔案中包含vector.cpp檔案呢?
答:因為我的Vector類(https://blog.csdn.net/weixin_40417029/article/details/80351865)的函式定義與宣告是分離的。在構建時會出現“error LNK2019: 無法解析的外部符號 ”的錯誤。在Linux作業系統下會出現下面的錯誤:
要解決這樣的問題,除了我使用的方法外,還可以使用:
- 第一種方法,就是把類模板中成員函式的宣告和定義都放在類的定義中(.h檔案),不要分開就行。
- 第二種方法,在主檔案(main檔案)中既包含類模板的宣告檔案(介面檔案)(.h檔案),同時也包含類模板的實現檔案(.cpp檔案)就行了。
- 第三種方法,在類的定義中(.h檔案)的最後包含類模板的實現檔案(.cpp檔案)。
原因在於模板類和模板函式在使用的時候才會被例項化。當模板被使用時,編譯器需要函式所有的實現程式碼,來用合適的型別(模板引數)去構建正確的函式。但是如果將函式實現在單獨的原始檔中,這些檔案是不可見的,因而會出錯。
實現queue:
同樣的實現佇列也要這樣做:
//queue #pragma once #include "List.h" #include "List.cpp" template<class T, class Container=List<T> > class Queue { public: void Push(T x) { _con.PushBack(x); } void Pop() { _con.PopFront(); } int Size() { _con.Size(); } T& Front() { return _con.Front() -> _data; } protected: Container _con; };