網站首頁 編程語言 正文
泛型編程最初提出時的動機很簡單直接:發明一種語言機制,能夠幫助實現一個通用的標準容器庫。
所謂通用的標準容器庫,就是要能夠做到,比如用一個List類存放所有可能類型的對象這樣的事;
泛型編程讓你編寫完全一般化并可重復使用的算法,其效率與針對某特定數據類型而設計的算法相同。
泛型即是指具有在多種數據類型上皆可操作的含義,與模板有些相似。
STL巨大,而且可以擴充,它包含很多計算機基本算法和數據結構,而且將算法與數據結構完全分離,其中算法是泛型的,不與任何特定數據結構或對象類型系在一起。(STL是Standard Template Library的簡稱,中文名標準模板庫)
泛型編程最初誕生于C++中,目的是為了實現C++的STL(標準模板庫)。其語言支持機制就是模板(Templates)。模板的精神其實很簡單:參數化類型。換句話說,把一個原本特定于某個類型的算法或類當中的類型信息抽掉,抽出來做成模板參數T。
泛型編程Cgencric programming)是 C++支持的另一種編程模式。它與OOP的目標相同,即使重用代碼和抽象通用概念的技術更簡單。不過OOP強調的是編程的數據方面,而泛型編程強調的是獨立于特定數據類型,它們的側重點不同.OOP是一個管理大型項目的工具,而泛型編程提供了執行常見任務(如對數據排序或合并鏈表)的工具。
術語泛型(generic)指的是創建獨立于類型的代碼。C++的數據表示有多種類型—整數、小數、字符、字符串、用戶定義的、由多種類型組成的復合結構,例如,要對不同類型的數據進行排序,通常必須為每種類型創建一個排序函數,泛型編程需要對語言進行擴展,以便可以只編寫一個泛型(即不是特定類型的)函數,并將其用于各種實際類型。C++模板提供了完成這種任務的機制。
?C++的標準模板庫(STL)主要由三個組件構成:1、容器;2、迭代器;3、泛型算法
一、容器
對容器的通用型操作:
- "==", "!="判斷兩個容器是否相等
- "="將一個容器復制給另一個容器
- .empty()判斷是不是空的,有沒有元素
- .size() 返回容器內元素的個數
- .clear() 刪除容器內所有元素
array
數組array,最一般的數組,和C的數組一樣,長度固定,聲明如下:
#include<array> //格式array<typename,length> Varname; array<int, 10> arr;
vector
vector,相當于動態數組,用的最多最方便,長度可以隨時擴充:
#include<vector> //格式vector<typename> Varname; vector<double> Vet; vector<int> Vet1(10); Vet1.push_back(5);//后端插入 Vet1.pop_back();//后端刪除
deque
也是個線性表,和vector類似,不過是雙向的,可以在前端插入和刪除
#include<deque> deque<double> Var1; Var1.push_front(6);//前端插入 Var1.pop_front();//前端刪除
list
雙向鏈表,不是線性表,存儲的內容不是在連續的內存上,每個節點都有一個value和兩個指針back, front分別只想前面和后面的節點;
set集合,只有key
#include<set> #include<string> set<string> word_set; word_set.count(key);//返回個數,要么0,要么1
map 鍵值對key/value
key通常是字符串,相當于索引;
有.find(key)成員函數,返回查找的key的iterator,否則返回map.end()
#include<iostream> #include<map> #include<string> using namespace std; int main() { map<string,int> words; string word; //統計輸入每種字符的個數,map中沒有的會自動創建 while(cin>>word) words[word]++; map<string,int>::iterator it=words.begin() //依次打印map中的內容,first成員對應key,second成員對應value for(;it!=words.end();it++) cout<<"key: "it->first<<" value: "<<it->second<<endl; return 0; }
二、迭代器iterator(泛型指針)
類似于指針,作用于容器類上
.begin()
相當與頭指針,指向第一個元素的指針
.end()
指向最后一個元素的后面的指針
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之前一個元素,返回被插入的元素的iterator iterator insert(itrator position, elemType value); //插入count個值 void insert(iterator position, int count, elemType value); //插入[first,last)之間的元素 void insert(iterator position, iterator first, iterator last);
erase()刪除
//刪除一個元素,返回被刪除后,接下來后一個元素的iterator iterator erase(iterator position); //刪除范圍內元素[first,last) iterator erase(iterator first, iterator last);
find()用于無序搜索,搜素范圍[first, last), 返回iterator, 找不到則返回last
iterator find(iterator first, iterator last, elemType findvalue);
copy() 復制
//參數 要復制的 開始 結束, 復制目的地的 開始 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() { //產生空的容器 list<string> slist; vector<int> ivec; //產生特定大小的容器 list<int> ilist(100); vector<string> svec(32); //產生特定大小的容器,并賦值全相同的初值 vector<int> ivec(10,1); //10個1 list<string> slist(16,"WoW"); //通過兩個迭代器iterator賦值 int arr[8]={1,1,2,2,3,5,6,4}; vector<int> ivec1(ia,ia+8); //賦值[ia,ia+8)之間的內容 int a=ivec1.front();//讀取第一個元素 a=ivec1.back(); //讀取最后一個元素 ivec1.push_back(10); //在最后插入元素 ivec1.pop_back(); //刪除最后一個元素 //復制容器賦值 list<string> slist1(5,"wfq"); list<string> slist2(slist1); //復制賦值 return 0; }
原文鏈接:https://blog.csdn.net/qq_41253960/article/details/121972285
相關推薦
- 2022-05-06 C語言中回調函數的使用詳情_C 語言
- 2022-07-14 C++簡明分析講解引用與函數提高及重載_C 語言
- 2022-06-15 go語言定時器Timer及Ticker的功能使用示例詳解_Golang
- 2022-11-05 python中的bisect模塊與二分查找詳情_python
- 2022-10-09 Xshell連接不上虛擬機的解決辦法匯總_Linux
- 2022-08-28 elasticsearch-倒排索引原理
- 2022-07-07 Python數據分析之?Matplotlib?散點圖繪制_python
- 2022-04-09 DM8 數據庫連接Alibaba druid 提示:dbType not support
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支