【GeekBand】stl首周

1.C++模板簡(jiǎn)介

1.模板概觀

模板是c++的一種特性,允許函數(shù)或類(對(duì)象)通過泛型的形式表現(xiàn)或運(yùn)行

c++通常使用兩種模板
a.類模板估蹄,使用泛型參數(shù)的類
b.函數(shù)模板,使用泛型參數(shù)的函數(shù)

2.函數(shù)模板

template<typename T>
inline T Max(T a,T b)
{
    return (a > b)?a:b;
}

從語法上講,class和typename沒有區(qū)別操禀,但不能使用struct勇边; 盡量使用typename犹撒; 模板實(shí)例化,編譯器自動(dòng)的粒褒; 如果該型別不支持函數(shù)所使用的操作识颊,會(huì)報(bào)錯(cuò); (比如std::complex沒有重載>奕坟,但函數(shù)里使用了complex類的>) 模板會(huì)被編譯兩次祥款,一次是本身,一次是調(diào)用時(shí)候的實(shí)例化执赡; 參數(shù)推導(dǎo)镰踏,每個(gè)T必須嚴(yán)格匹配,不允許自動(dòng)類型轉(zhuǎn)換沙合; 比如Max(1,2.0); 解決1:用static_cast或強(qiáng)制轉(zhuǎn)換:Max(static_cast(1),2.0) 解決2:顯式指定T的類型:Max(1,2.0)//1可以轉(zhuǎn)換成double 函數(shù)模板可以像普通函數(shù)一樣重載奠伪,可以重載同名的非模板函數(shù); Max('a',4.2)參數(shù)類型不同首懈,當(dāng)存在非模板函數(shù)時(shí)绊率,會(huì)調(diào)用非模板函數(shù)進(jìn)行類型轉(zhuǎn)換; 重載版本的聲明必須位于調(diào)用位置之前究履;

3.類模板

類也可以通過參數(shù)泛化滤否,從而可以創(chuàng)建出一族不同類型的類實(shí)例(對(duì)象);
類模板實(shí)參可以使某一型別或者常量(僅限int或enum)最仑;
在內(nèi)部T像其他類型一樣定員成員變量和成員函數(shù)藐俺;
如果類模板中需要使用到這個(gè)類模板本身炊甲,應(yīng)該使用其完整定義,帶<...>的形式欲芹;
Stack >兩個(gè)尖括號(hào)不要連到一起卿啡,會(huì)編譯成<<,經(jīng)過驗(yàn)證菱父,新版編譯器不會(huì)出現(xiàn)該問題;
類模板特化颈娜,要把所有成員函數(shù)都重寫一遍;可以添加新的成員函數(shù)浙宜;

偏特化:

template <typename T1,typename T2>class MyClass{...};
template <typename T> class MyClass{...};    偏特化成同類型;
template <typename T>class MyClass<T,int>{...};  偏特化成非泛型;
template <typename T1,typename T2>class MyClass<T1*,T2*>{...};   偏特化成指針;

如果調(diào)用同等的匹配不止一個(gè)偏特化官辽,二義性,編譯器不會(huì)通過粟瞬;
如下所示:

MyClass<int,int>; //可同時(shí)匹配2同仆,3同類型和參數(shù)2偏特化為int
MyClass<int*,int*>; //可同時(shí)匹配2,4同類型和指針

類模板參數(shù)可以有默認(rèn)值亩钟,如下:

template<typename T,typename TContainer = std::vector<T>>
class stack
{
    private:TContainer m_Container;
}

2.泛型編程

1.概觀

泛型編程是一種編程方法乓梨,這種方法將型別(type)以一種to-be-specified-later的方式給出,等到需要調(diào)用時(shí)清酥,再以參數(shù)方式扶镀,通過具體的、特定的型別實(shí)例化一個(gè)具體的方法或?qū)ο?泛型編程是一種編程想法或思維焰轻,并不依賴于具體語言

2.特性 Traits

A[0],A[1],A[2].....A[n]

如何構(gòu)建型別為T的初始類型臭觉,姑且使用T(0);
如果求和函數(shù),求出的結(jié)果超出了類型的容量辱志,
比如char數(shù)組”abc“蝠筑,求和的值大于char類型容量255
會(huì)溢出overflow,此時(shí)可以強(qiáng)制使用來儲(chǔ)存揩懒,或者使用Traits什乙; Sigma函數(shù)的返回值的型別叫做T的trait;

T -> association -> characteristic of T -> another type -> trait;

Traits可以實(shí)現(xiàn)為模板類已球,而關(guān)聯(lián)(association)是針對(duì)每個(gè)具體型別T的特化臣镣;
在這個(gè)例子里traits命名為Sigma Traits,叫做traits模板(traits template);
Traits可以實(shí)現(xiàn)為模板類;

template class SigmaTraits{};
template<>class SigmaTraits{
    public: typedef int Return Type;}   //當(dāng)傳進(jìn)去的是char,return的類型變成int智亮;

把每個(gè)傳入類型都指定return的類型忆某;
typename SigmaTrais::ReturnType //這一串是返回類型的寫法;
3.迭代器

本身是一個(gè)對(duì)象,指向另一個(gè)(可以被迭代的)對(duì)象阔蛉;
算法通常以迭代器作為輸入?yún)?shù)弃舒;

3.容器

1.Vector

存放任意型別的動(dòng)態(tài)數(shù)組;數(shù)據(jù)結(jié)構(gòu)和操作與數(shù)組類似状原,在內(nèi)存中是一段地址連續(xù)的空間聋呢;
Vector支持動(dòng)態(tài)空間大小調(diào)整苗踪,隨著元素的加入,vector內(nèi)部會(huì)自動(dòng)擴(kuò)充內(nèi)存空間坝冕;
頭文件vector徒探,名稱空間std;
2.創(chuàng)建

創(chuàng)建一個(gè)T型別的空vector:    vectorv;
創(chuàng)建一個(gè)容量是n的T型別vector: vectorv(n);
創(chuàng)建一個(gè)容量是n的T型別vector喂窟,并且都初始化為i:    vectorv(n,i);
創(chuàng)建一個(gè)已有v的拷貝: vectorcopyOfV(v);
通過一個(gè)數(shù)組創(chuàng)建一個(gè)vector:   int array[]={1,2,3,4,5,6,7};
    vectorv(array,array+10);

3.方法

調(diào)用push_back函數(shù),表示將元素添加至其尾部:
判斷是否為空:empty();
獲取大醒氪:size();
訪問:


vector::at();   越界會(huì)拋出exception磨澡,但效率不如operator;
vector::operator[]; 不做邊界檢查质和,但訪問效率高稳摄;

刪除:

clear:清除整個(gè)vector;
pop_back:彈出vector尾部元素饲宿;
erase:刪除vector中某一位置的元素
        用法一:指定刪除某一元素厦酬,v.erase(it+1); //t位置+1的位置的元素;
        用法二:刪除指定的滿足某條件的瘫想;

對(duì)象里面重載了operator()的話仗阅,調(diào)用方法像函數(shù)一樣;

  1. Deque

能存放任意型別的雙向隊(duì)列国夜,新增了兩個(gè)方法:

push_front: 在頭部插入一個(gè)元素减噪;
pop_front: 在頭部彈出一個(gè)元素;

5.List
存放任意型別的雙向鏈表(double linked list); 有next和prev指針指向前一個(gè)和后一個(gè)元素车吹; 頭文件list和名稱空間std筹裕;
優(yōu)勢(shì): 彈性,可以隨意插入和刪除元素窄驹,只需要改變next和prev的指針鏈接朝卒; 對(duì)于移動(dòng)元素到另一個(gè)list,沒有發(fā)生復(fù)制乐埠;
劣勢(shì): 只能以連續(xù)的方式存取list中的元素抗斤,查找任意元素的平均時(shí)間和list長度成線性比例; 對(duì)于查找饮戳、隨機(jī)存取等元素定位操作豪治,效率低; 在每個(gè)元素節(jié)點(diǎn)上增加一些較為嚴(yán)重的開銷扯罐,即向前向后兩個(gè)指針负拟;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歹河,隨后出現(xiàn)的幾起案子掩浙,更是在濱河造成了極大的恐慌花吟,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厨姚,死亡現(xiàn)場(chǎng)離奇詭異衅澈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谬墙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門今布,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拭抬,你說我怎么就攤上這事部默。” “怎么了造虎?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵傅蹂,是天一觀的道長。 經(jīng)常有香客問我算凿,道長份蝴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任氓轰,我火速辦了婚禮婚夫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戒努。我一直安慰自己请敦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布储玫。 她就那樣靜靜地躺著侍筛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撒穷。 梳的紋絲不亂的頭發(fā)上匣椰,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音端礼,去河邊找鬼禽笑。 笑死扛拨,一個(gè)胖子當(dāng)著我的面吹牛靴迫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播姊氓,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼凡桥,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蟀伸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤啊掏,失蹤者是張志新(化名)和其女友劉穎蠢络,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迟蜜,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刹孔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娜睛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片髓霞。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖微姊,靈堂內(nèi)的尸體忽然破棺而出酸茴,到底是詐尸還是另有隱情,我是刑警寧澤兢交,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站笼痹,受9級(jí)特大地震影響配喳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凳干,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一晴裹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧救赐,春花似錦涧团、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至预厌,卻和暖如春阿迈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轧叽。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工苗沧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炭晒。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓待逞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親网严。 傳聞我的和親對(duì)象是個(gè)殘疾皇子识樱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,521評(píng)論 1 51
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin牺荠! 什么是Kotlin翁巍? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,217評(píng)論 9 118
  • 1.模板觀念與函數(shù)模板 課程主要內(nèi)容 C++模板簡(jiǎn)介 泛型編程 容器 進(jìn)階 C++模板簡(jiǎn)介 ??generic t...
    hui1429閱讀 327評(píng)論 0 0
  • STL和泛型編程 Week6 Notes 1.模板概念和模板函數(shù) C++模板簡(jiǎn)介 概觀 為什么會(huì)有模板這個(gè)概念 S...
    古來征戰(zhàn)幾人回閱讀 293評(píng)論 0 0
  • 為什么生而為人對(duì)阿二來講是一個(gè)無法解釋也是無法改變的事情。 這個(gè)世界上有如此多的物種休雌,除了人這樣的生物灶壶,其他所有物...
    十叁幺閱讀 298評(píng)論 0 0