模板函式實現原理
結尾在上一次的stl學習中,明白了關於c++標準庫中的的第乙個內部使用物件i/o物件的使用,包括基本的輸入輸出,與檔案內容的輸入輸出,順便學習了系統操作引數int argc 與char* ar**,與對stl更為方便的函式表示式——lambda表示式:
[capture list]
(params list)
mutable exception-
>
return type
今天我們就要開始第二部學習,學習stl中的序列容器庫。
本來是打算這麼做的,但是之後嘗試學習閱讀一些函式非常吃力,因為有些內容應該在之後才會學的在我的那個學習路徑中提前用了,這樣不僅會導致學習十分吃力,並且基礎十分不牢。所以。。不如回到最初的起點,重頭開始。
時間回溯中。。
看一段**:
//函式:交換兩個int數
void
myswap
(int
& a,
int& b)
//函式:交換兩個double數
void
myswap
(double
& a,
double
& b)
兩個函式只有引數不一樣,業務邏輯都是一樣的,如果為了變數型別不同要寫如此多的函式的話,不僅佔空間,增加可執行檔案的大小。而且重複勞動,容易出錯,增加維護成本。所以使用模板技術。
模板技術的好處是可以使得型別引數化,即編寫**可以忽略型別,用乙個標誌/符號代替所有型別。
為了讓編譯器區分是普通函式還是模板函式,這樣書寫:
template
<
class
t>
//也可以用template,並且class後面可以接不知乙個引數可以是
//告訴編譯器,下面寫模板函式,不要隨便報錯
void
myswap
(t& a,t& b)
//注意:template只對它後面第乙個函式生效
//並且class後面可以接不知乙個引數可以是
void
test01()
//函式模板必須嚴格的型別型別匹配
intmyadd
(int a,
char c)
//普通函式可以進行自動型別轉換
void
test02()
1.函式模板可以像普通函式一樣被過載:template
<
class
t>
void
print
(t a)
void
print
(t a,t b)
2.編譯器優先考慮普通函式
函式在呼叫的時候,編譯器會先呼叫普通函式,普通函式不滿足的時候再考慮用模板函式匹配
做手鍊模子 - 生產具體的手鍊 - 再戴手上
同理:由函式模板,生成模板函式,再被使用。
myswap
(float
,float
)//會生成乙個float型別的模板函式
myswap
(int
,int
)//會生成乙個int型別的模板函式
編譯器並不把函式模板處理成能處理任何型別的函式
函式模板通過具體型別產生不同的函式
編譯器會對函式模板進行兩次編譯,在宣告的地方對模板**本身進行編譯,在呼叫的地方對引數替換後的**再進行第二次編譯。
stl開始從頭開始,其實也就之前沒開始多久。不過還好提前意識到了前一種學習路徑其實涉及大量提前內容,對於我來說勢必會造成許多的困擾。不如從頭用一種更為基礎的方式去深入,想必在基礎鞏固的同時,道路也會輕鬆不少。
機器學習第二回 矩陣部分總結
感覺這一回的前半部分還很簡單,屬於矩陣的基本操作,所以進行乙個簡單的總結,可能隨著學習的深入還會補充 矩陣 通常用大寫字母表示,而數字的表示通常使用小寫字母 在本課程中,下標都從1開始。向量 單列矩陣,通常是n 1階,向量的行數也稱為維數。對應序號位置的元素相加即可 做加法的兩個矩陣的維數必須相同 ...
JS學習筆記 (二)回流和重繪
在搞清楚回流和重繪的概念之前,我們要清除瀏覽器的渲染過程。解析生成dom tree 此時包含所有節點,包括display none 根據css object module ccssom 計算節點的幾何屬性 座標和大小 margin,pading,height,width等 生成render tree...
JS學習筆記 (二)回流和重繪
在搞清楚回流和重繪的概念之前,我們要清除瀏覽器的渲染過程。解析生成dom tree 此時包含所有節點,包括display none 根據css object module ccssom 計算節點的幾何屬性 座標和大小 margin,pading,height,width等 生成render tree...