title: 模板初階
date: 2019-03-18 20:37:56
tags: cpp
categories: cpp
toc: true
告訴編譯器乙個模子,讓編譯器根據不同的型別利用該模子來生成**。
泛型程式設計:編寫與型別無關的通用**,是**復用的一種手段。模板是泛型程式設計的基礎。
函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。
template
<
typename t1,
typename t2,..
....
,typename tn>
返回值型別 函式名(引數列表)
template
<
typename t>
// 模板頭
void
swap
(t& left, t& right)
⚠️ 注意:typename 是用來定義模板引數關鍵字,也可以使用 class (切記:不能使用 struct 代替 class)
模板是乙個藍圖,它本身並不是函式,是編譯器用使用方式產生特定具體型別函式的模具。所以其實模板就是將本來應該我們做的重複的事情交給了編譯器。
在編譯器編譯階段,對於模板函式的使用,編譯器需要根據傳入的實參型別來推演生成對應型別的函式以供呼叫。
用不同型別的引數使用函式模板時,稱為函式模板的例項化。模板引數例項化分為:隱式例項化和顯式例項化。
隱式例項化
讓編譯器根據實參推演模板引數的實際型別。
template
<
class
t>
t add
(const t& left,
const t& right)
intmain()
顯示例項化
顯式例項化:在函式名後的 <> 中指定模板引數的實際型別。
如果型別不匹配,編譯器會嘗試進行隱式型別轉換,如果無法轉換成功編譯器將會報錯。
add<
int>
(a, b)
;
1. 懶
乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式。
編譯器也很「懶」,哈哈。編譯器:「這裡你已經有了,我就不給你再推斷再生成乙個函式去覆蓋你的了。」
// 非模板函式
intadd
(int left,
int right)
// 通用加法函式 template
t add
(t left, t right)
void
test()
2. 勤快
對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式, 那麼將選擇模板。
add(1
,2.0);
// 模板函式可以生成更加匹配的版本,編譯器根據實參生成更加匹配的add函式
3. 小氣
模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換。
class 類模板名
;
⚠️ 注意:叫法上有一點需要注意一哈!
注意:
date類:
類名 date 型別 date
模板類:
類名 vector 型別 vector
? 栗子:vector 動態順序表
template
<
class
t>
class
vector
// 使用析構函式演示:在類中宣告,在類外定義。 ~vector();
void
pushback
(const t& data)
void
popback()
size_t size()
t&operator
(size_t pos)
private
: t* _pdata;
size_t _size;
size_t _capacity;
};
⚠️ 注意:
類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟 <>,然後將例項化的型別放在 <> 中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。
vector<
int> s1;
s1.pushback(1
);s1.pushback(2
);s1.pushback(3
);vector<
double
> s2;
s2.pushback
(1.0);
s2.pushback
(2.0);
s2.pushback
(3.0);
for(size_t i =
0; i < s1.
size()
;++i)
cout
0; i < s2.
size()
;++i)
cout<網上有句話說:「不懂stl,不要說你會c++」,入坑學習咯。
stl(standard template libaray-標準模板庫):是 c++ 標準庫的重要組成部分,不僅是乙個可復用的元件庫,而且
是乙個包羅資料結構與演算法的軟體框架。
原始版本alexander stepanov、meng lee 在惠普實驗室完成的原始版本,本著開源精神,他們宣告允許任何人任意 運用、拷貝、修改、傳播、商業使用這些**,無需付費。唯一的條件就是也需要向原始版本一樣做開源使 用。 hp 版本–所有stl實現版本的始祖。
p. j. 版本由p. j. plauger開發,繼承自hp版本,被windows visual c++採用,不能公開或修改,缺陷:可讀性比較低, 符號命名比較怪異。
rw版本由rouge wage公司開發,繼承自hp版本,被 c+ + builder 採用,不能公開或修改,可讀性一般。
✨sgi版本由silicon graphics computer systems,inc公司開發,繼承自hp版 本。被gcc(linux)採用,可移植性好, 可公開、修改甚至販賣,從命名風格和程式設計風格上看,閱讀性非常高。
容器(container)
演算法(algorithm)
迭代器(iterator)
仿函式(function object)
介面卡(adaptor)
空間配置器(allocator)
能用,明理,能擴充套件。
stl 庫的更新太慢了。這個得嚴重吐槽,上一版靠譜是c++98,中間的c++03基本一些修訂。c++11出來已經相隔了13年,stl才進一步更新。
stl 現在都沒有支援執行緒安全。併發環境下需要我們自己加鎖。且鎖的粒度是比較大的。
stl 極度的追求效率,導致內部比較複雜。比如型別萃取,迭代器萃取。
stl 的使用會有**膨脹的問題,比如使用 vector/vector/vector 這樣會生成多份**,當然這是模板語法本身導致的。
C 模板初階
template typename t void swap t left,t right intmain 在編譯器編譯階段,對於模板函式的使用,編譯器需要根據傳入的實參型別來推演生成對應型別的函式以供呼叫。比如 當用double型別使用函式模板時,編譯器通過對實參型別的推演,將t確定為double型...
C 模板初階
1.4普通函式和函式模板的區別 1.5普通函式和模板函式的呼叫規則 2.類模板 c 中的另一種程式設計思想成為泛型程式設計 編寫與型別無關的通用 是 復用的一種手段 主要利用的技術就是模板。c 中提供兩種模板機制 函式模板和類模板 函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,...
模板初階 函式模板和類模板
1.函式模板 格式 template.typename class tn include using namespace std template t add const t left,const t right template void swap const t left,const t rig...