這可能是一個比較抽象的問題饰序,因為泛型編程是比較高級的C++語法應(yīng)用没隘,在C++ Primer這本書已經(jīng)是第16章才開始講解烹俗,而我相信很多人看這章節(jié)的時候會不知所云的放棄這章降允。然而深入掌握泛型編程恩闻,掌握泛型算法,會讓你看開源代碼剧董,讀懂一些大型工程以及設(shè)計模式如虎添翼幢尚。
首先從兩個基礎(chǔ)面試題目講起
什么是泛型編程
泛型編程是以獨立于任何特定類型的方式編寫代碼,使用泛型程序時翅楼,需要提供具體程序?qū)嵗僮鞯念愋突蛑迪啦荨_@個是不是有點暈乎乎的。舉個例子犁嗅,比如說vector這個用法边涕,你是不是可以往里壓入各種數(shù)據(jù)類型的,float,int,struct都能存儲功蜓,區(qū)別只在于所包含的元素類型园爷。
C++如何實現(xiàn)泛型編程
在C++中模板是泛型編程的基礎(chǔ)。在C++中模板技術(shù)的實現(xiàn)包括函數(shù)模板和類模板式撼。通過實現(xiàn)函數(shù)模板和類模板童社,可以為不同的類型提供通用的代碼。
模板定義以關(guān)鍵字template開始著隆,后接模板形參表扰楼,模板形參表是用尖括號括住的一個或多個模板形參的列表,形參之間以逗號分隔美浦。比如:
template?int CompareData(constT?&v1,constT?&?v2){if(v1 < v2)return-1;if(v2 < v1)return1;return0;}
至于函數(shù)模板和類模板怎么去定義和實例化弦赖,這里就不列舉。
其次浦辨,講講最負盛名的STL蹬竖,泛型編程用得淋漓盡致
你所用到的vector,map,list這些都不陌生,平時你沒發(fā)現(xiàn)流酬,如果不采用泛型編程币厕,你自己一個個去實現(xiàn)他,可能你會重載芽腾,但是會耗費你百倍千倍的時間旦装,并且不得而終。
而 STL(Standard Template Library摊滔,標準模板庫) 是泛型編程思想的實現(xiàn)同辣。高效、泛型惭载、可交互操作旱函,巨大,可擴充描滔,它包含很多計算機基本算法和數(shù)據(jù)結(jié)構(gòu)棒妨,而且將算法與數(shù)據(jù)結(jié)構(gòu)完全分離,其中算法是泛型的含长,不與任何特定數(shù)據(jù)結(jié)構(gòu)或?qū)ο箢愋拖翟谝黄鹑弧缀跄阌玫降臄?shù)據(jù)類型,以及需要的比如哈希表拘泞,鏈表排序纷纫,各種索引等都能在STL上找到。
迭代器是STL的核心陪腌,它是泛型指針辱魁,能指向其他對象的對象烟瞧,遍歷由對象形成的區(qū)間。
最后染簇,講講泛型編程的好處
普通人用泛型編程参滴,只是針對少寫幾個重載函數(shù),能夠簡化代碼量锻弓,給工作帶來方便砾赔。大神用泛型編程,則是專注于算法和數(shù)據(jù)結(jié)構(gòu)進行設(shè)計青灼,讓算法與數(shù)據(jù)結(jié)構(gòu)在不損失效率的前提下暴心,運用到最為通用的環(huán)境中。也就是在架構(gòu)中杂拨,讓泛型編程服務(wù)每個模塊专普。
泛型編程可能更加輕重的是一種思想上的語法,一種形而上學(xué)的理念扳躬。它具備以下優(yōu)點
通用性強
泛型算法的一致性脆诉,用到的類型集是無限的或者非綁定的
類型檢查嚴
靜態(tài)類型信息被完整的保存在了編譯期甚亭,編譯期能發(fā)覺更多的潛在錯誤
效率高
編譯器能確定靜態(tài)類型信息贷币,效率與針對某特定數(shù)據(jù)類型而設(shè)計的算法想通
缺點
二進制復(fù)用性差
泛型算法是建立在語法一致性上,語法是代碼層面的亏狰,語法上的約定無法體現(xiàn)在二進制層面役纹。泛型算法實現(xiàn)的庫,其源代碼基本上是必須公開的暇唾。而傳統(tǒng)的C庫全是以二進制形式發(fā)布的促脉。
平時大家可能覺得面向?qū)ο缶幊淌荂++的核心精髓,但是卻不知道泛型編程同樣也是C++編程的核心策州,大都數(shù)設(shè)計模式瘸味,開源第三方庫,以及一些軟件工程思想够挂,也都是基于泛型編程理念敲磚下來旁仿。而不僅僅是C++語言,C#孽糖,Kotlin枯冈,Java等,都有這個泛型編程办悟,可以說用好泛型編程尘奏,大型工程項目沒煩惱。
兔云程序
致力于推廣編程教程病蛉,服務(wù)程序員
24篇原創(chuàng)內(nèi)容
公眾號