C++泛型編程Generic?Programming的使用
泛型編程最初提出時(shí)的動(dòng)機(jī)很簡(jiǎn)單直接:發(fā)明一種語(yǔ)言機(jī)制,能夠幫助實(shí)現(xiàn)一個(gè)通用的標(biāo)準(zhǔn)容器庫(kù)。
所謂通用的標(biāo)準(zhǔn)容器庫(kù),就是要能夠做到,比如用一個(gè)List類存放所有可能類型的對(duì)象這樣的事;
泛型編程讓你編寫完全一般化并可重復(fù)使用的算法,其效率與針對(duì)某特定數(shù)據(jù)類型而設(shè)計(jì)的算法相同。
泛型即是指具有在多種數(shù)據(jù)類型上皆可操作的含義,與模板有些相似。
STL巨大,而且可以擴(kuò)充,它包含很多計(jì)算機(jī)基本算法和數(shù)據(jù)結(jié)構(gòu),而且將算法與數(shù)據(jù)結(jié)構(gòu)完全分離,其中算法是泛型的,不與任何特定數(shù)據(jù)結(jié)構(gòu)或?qū)ο箢愋拖翟谝黄?。(STL是Standard Template Library的簡(jiǎn)稱,中文名標(biāo)準(zhǔn)模板庫(kù))
泛型編程最初誕生于C++中,目的是為了實(shí)現(xiàn)C++的STL(標(biāo)準(zhǔn)模板庫(kù))。其語(yǔ)言支持機(jī)制就是模板(Templates)。模板的精神其實(shí)很簡(jiǎn)單:參數(shù)化類型。換句話說(shuō),把一個(gè)原本特定于某個(gè)類型的算法或類當(dāng)中的類型信息抽掉,抽出來(lái)做成模板參數(shù)T。
泛型編程Cgencric programming)是 C++支持的另一種編程模式。它與OOP的目標(biāo)相同,即使重用代碼和抽象通用概念的技術(shù)更簡(jiǎn)單。不過(guò)OOP強(qiáng)調(diào)的是編程的數(shù)據(jù)方面,而泛型編程強(qiáng)調(diào)的是獨(dú)立于特定數(shù)據(jù)類型,它們的側(cè)重點(diǎn)不同.OOP是一個(gè)管理大型項(xiàng)目的工具,而泛型編程提供了執(zhí)行常見任務(wù)(如對(duì)數(shù)據(jù)排序或合并鏈表)的工具。
術(shù)語(yǔ)泛型(generic)指的是創(chuàng)建獨(dú)立于類型的代碼。C++的數(shù)據(jù)表示有多種類型—整數(shù)、小數(shù)、字符、字符串、用戶定義的、由多種類型組成的復(fù)合結(jié)構(gòu),例如,要對(duì)不同類型的數(shù)據(jù)進(jìn)行排序,通常必須為每種類型創(chuàng)建一個(gè)排序函數(shù),泛型編程需要對(duì)語(yǔ)言進(jìn)行擴(kuò)展,以便可以只編寫一個(gè)泛型(即不是特定類型的)函數(shù),并將其用于各種實(shí)際類型。C++模板提供了完成這種任務(wù)的機(jī)制。
?C++的標(biāo)準(zhǔn)模板庫(kù)(STL)主要由三個(gè)組件構(gòu)成:1、容器;2、迭代器;3、泛型算法
一、容器
對(duì)容器的通用型操作:
- "==", "!="判斷兩個(gè)容器是否相等
- "="將一個(gè)容器復(fù)制給另一個(gè)容器
- .empty()判斷是不是空的,有沒有元素
- .size() 返回容器內(nèi)元素的個(gè)數(shù)
- .clear() 刪除容器內(nèi)所有元素
array
數(shù)組array,最一般的數(shù)組,和C的數(shù)組一樣,長(zhǎng)度固定,聲明如下:
#include<array> //格式array<typename,length> Varname; array<int, 10> arr;
vector
vector,相當(dāng)于動(dòng)態(tài)數(shù)組,用的最多最方便,長(zhǎng)度可以隨時(shí)擴(kuò)充:
#include<vector> //格式vector<typename> Varname; vector<double> Vet; vector<int> Vet1(10); Vet1.push_back(5);//后端插入 Vet1.pop_back();//后端刪除
deque
也是個(gè)線性表,和vector類似,不過(guò)是雙向的,可以在前端插入和刪除
#include<deque> deque<double> Var1; Var1.push_front(6);//前端插入 Var1.pop_front();//前端刪除
list
雙向鏈表,不是線性表,存儲(chǔ)的內(nèi)容不是在連續(xù)的內(nèi)存上,每個(gè)節(jié)點(diǎn)都有一個(gè)value和兩個(gè)指針back, front分別只想前面和后面的節(jié)點(diǎn);
set集合,只有key
#include<set> #include<string> set<string> word_set; word_set.count(key);//返回個(gè)數(shù),要么0,要么1
map 鍵值對(duì)key/value
key通常是字符串,相當(dāng)于索引;
有.find(key)成員函數(shù),返回查找的key的iterator,否則返回map.end()
#include<iostream> #include<map> #include<string> using namespace std; int main() { map<string,int> words; string word; //統(tǒng)計(jì)輸入每種字符的個(gè)數(shù),map中沒有的會(huì)自動(dòng)創(chuàng)建 while(cin>>word) words[word]++; map<string,int>::iterator it=words.begin() //依次打印map中的內(nèi)容,first成員對(duì)應(yīng)key,second成員對(duì)應(yīng)value for(;it!=words.end();it++) cout<<"key: "it->first<<" value: "<<it->second<<endl; return 0; }
二、迭代器iterator(泛型指針)
類似于指針,作用于容器類上
.begin()
相當(dāng)與頭指針,指向第一個(gè)元素的指針
.end()
指向最后一個(gè)元素的后面的指針
vector<int> Var{4,5,7,8}; vector<int>::iterator head=Var.begin(); vector<int>::iterator tail=Var.end(); for(;head!=tail;head++) //遍歷容器類 { cout<<*head<<endl; }
三、泛型算法Generic Programming
insert()插入
//插入到position之前一個(gè)元素,返回被插入的元素的iterator iterator insert(itrator position, elemType value); //插入count個(gè)值 void insert(iterator position, int count, elemType value); //插入[first,last)之間的元素 void insert(iterator position, iterator first, iterator last);
erase()刪除
//刪除一個(gè)元素,返回被刪除后,接下來(lái)后一個(gè)元素的iterator iterator erase(iterator position); //刪除范圍內(nèi)元素[first,last) iterator erase(iterator first, iterator last);
find()用于無(wú)序搜索,搜素范圍[first, last), 返回iterator, 找不到則返回last
iterator find(iterator first, iterator last, elemType findvalue);
copy() 復(fù)制
//參數(shù) 要復(fù)制的 開始 結(jié)束, 復(fù)制目的地的 開始 copy(iterator first, iterator last, iterator To_first); vector<int> ivet; vector<int> temp{1,2,3,4,5}; copy(temp.begin(), temp.end(), ivec.begin());
#include<vector> #include<deque> #include<list> #include<string> using namespace std; int main() { //產(chǎn)生空的容器 list<string> slist; vector<int> ivec; //產(chǎn)生特定大小的容器 list<int> ilist(100); vector<string> svec(32); //產(chǎn)生特定大小的容器,并賦值全相同的初值 vector<int> ivec(10,1); //10個(gè)1 list<string> slist(16,"WoW"); //通過(guò)兩個(gè)迭代器iterator賦值 int arr[8]={1,1,2,2,3,5,6,4}; vector<int> ivec1(ia,ia+8); //賦值[ia,ia+8)之間的內(nèi)容 int a=ivec1.front();//讀取第一個(gè)元素 a=ivec1.back(); //讀取最后一個(gè)元素 ivec1.push_back(10); //在最后插入元素 ivec1.pop_back(); //刪除最后一個(gè)元素 //復(fù)制容器賦值 list<string> slist1(5,"wfq"); list<string> slist2(slist1); //復(fù)制賦值 return 0; }
到此這篇關(guān)于C++泛型編程Generic Programming的使用的文章就介紹到這了,更多相關(guān)C++泛型編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用GUID(全局統(tǒng)一標(biāo)識(shí)符)
這篇文章介紹了C#使用GUID(全局統(tǒng)一標(biāo)識(shí)符)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04Unity Shader實(shí)現(xiàn)描邊OutLine效果
這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)描邊OutLine效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01C#利用DesignSurface如何實(shí)現(xiàn)簡(jiǎn)單的窗體設(shè)計(jì)器
這篇文章主要介紹了C#利用DesignSurface如何實(shí)現(xiàn)簡(jiǎn)單窗體設(shè)計(jì)器的相關(guān)資料,文中通過(guò)圖文及示例代碼介紹的很詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-02-02Unity中的PostProcessScene實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity中的PostProcessScene實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05