繼續昨天的學習,今天將要介紹的是,自己實現乙個stack的模板,然後在程式中例項化該模板,呼叫這個模板,以及使用模板函式優越性能的原因
1. 乙個stack 模板的例子**
#include #include
template class stack
} ;template void stack::push( t const & elem )
template void stack::pop()
template t stack::top () const
這段**是這樣的,首先建立乙個模板類 stack 其中這個棧是通過vector 來存放其中的元素的,裡面定義了三個方法,分別是壓棧、彈棧、和返回棧頂元素。已經得到證明的一點就是,在將元素從棧中刪除但是同時又返回刪除的元素這種做法會帶來一定的安全隱患的,所以這裡的pop操作僅僅是將棧中元素刪除,而不提供將元素返回給呼叫者。
在壓棧的時候,直接呼叫的是vector stl中的預設方法。而在彈棧和返回棧頂元素的方法實現體中首先要對棧是否為空進行檢查,然後在呼叫vector中的方法來完成從棧中刪除乙個元素以及返回棧頂元素的功能。
2.呼叫stack的**例子
好了,下面介紹一下如何在自己編寫的在執行期執行的程式,例項化模板程式以及呼叫其中的方法來完成特定的功能
//stl6_15.cpp
#include #include #include #include "stack1.hpp"
int main ()
{ try
{ stackintstack ;
stackstringstack ;
intstack.push(3) ;
std::cout<
上面的程式是這樣的, 首先分別建立兩個stl 的stack 乙個是整數型別的另乙個是字串型別的,然後向這兩個棧中分別壓入元素,然後通過返回棧頂元素的方法來訪問棧結構中的元素,在訪問之後將其從棧中彈出。
在執行程式的時候,如果使用的是vs,有些不常用到的函式並沒有在安裝包中,這個時候需要通過
"除錯->選項和設定->(左邊)除錯->常規->啟動源伺服器"
另乙個就是「(左邊)符號->(右邊)勾選」微軟符號伺服器「 」
3. 模板函式效能優越於一般函式的原因
通過宣告型別stack, 在模板類內部就可以用int來例項化t。因此,intstack是乙個建立自stack的物件,它的元素儲存於stack中的vector中,這個vector 中支援的型別也是通過模板 t而設定為 int型別。對所有被呼叫的成員函式,都會例項化出基於int型別的函式**。如果使用stack,將會建立乙個 string 型別的 stack, 其中的元素儲存於vector中, 並且該vector 的型別是std::string 。 而對於所有被呼叫的成員函式,也會例項化出基於std::string的函式**出來。
在這裡需要注意的是, 只有那些被呼叫的成員函式,才會產生這樣的函式的例項化**, 對於類模板來說,成員函式只有在被使用的時候才會得到例項化。顯然,這中例項化的方式可以節省很多的時間和空間; 同時另乙個好處就是:對於那些「未提供所有成員函式中所有的操作的」型別, 你也可以使用該型別來例項化類模板,只要對那些「未能夠提供某些操作的成員函式,進對其模板頭進行相關符合規定的宣告即可,而模板內部不對其提供實現實體即可。 例如, 某些類模板中的成員函式會使用operator《來對元素進行排序:如果不呼叫這些」使用operator<「 的成員函式,那麼對於沒有定義operator< 的型別,也可以被用來例項化該類的模板。
在上面的例子中,缺少的是建構函式,push() top() 都被例項化了乙個 int 和string的版本, 而對於 pop() 僅僅被例項化了乙個string的版本,為什麼呢? 因為在程式中沒有對所建立的 int 型別的例項 intstack 呼叫pop方法,所以在程式編譯執行的時候是不會生成與int型別相關的pop 的操作的。 但是,另一方面,如果在定義模板類中,定義了靜態的成員的話,那麼無論在實際使用中是否會用到這些靜態成員(方法, 變數),用來例項化的每一種型別都是會例項化這些靜態成員的。
先到這,有時間再寫,然後我突然覺得,在早上的時候,可以做點數學題,這樣相當於給大腦做乙個晨練,一天的腦力可以得到很好的發揮,從明天開始實行(笑) ~
C 中的模板學習筆記1
想要學好c 的話,或是想要真正了解c 中的精髓和本質的話,c 中的stl,template 演算法都是必須要精通的。從今天來開始學習c 中的模板,參考和摘錄的書籍是 c template 中文版 和 boost 程式庫探秘 深度解析c 標準庫 作者很喜歡笑,新技能get.笑 1.基本概念 1.1 模...
Django學習筆記2(模板)
這一輪的學習主要是為了掌握django中關於模板的使用,為了開發與維護的高效,必然將要採取模組分離的方法,因此,html檔案最好不要直接硬編碼python,而是html頁面和python 單獨各位一塊,由一些鏈結的橋梁來將html載入到 之中.所以這段時間所學習的模板,其實就是為了達到這個目的,通常...
C 學習筆記(8) 模板
模板主要是提供一種處理方式,相當於加強版的函式處理,裡面的引數型別,處理方式都能夠被模板化,傳統的函式處理是不能夠針對多種處理方式的,所以會出現函式的過載問題。模板主要包括兩個方面 針對函式的模板,格式 template 函式返回值 函式名稱 函式引數 例如template void swap t ...