所謂泛型程式設計,就是不依賴於某一具體型別而使**具有很強適應性的程式設計正規化。我們看下面的求和函式是如何一步步進化成最純粹的泛型程式設計的。
最開始,sum
函式是這樣子的:
double sum(const std::vector&vec)
return result;
}
顯然這個函式只適用於std::vector
型別的容器變數,現在我們可以把vector
內部元素抽象成乙個模板,正如下面這樣的:
template t sum(const std::vector&vec, t start)
return start;
}
但是函式仍然只適用於std::vector
型別的容器變數,如果想要相容std::list
等等的其他容器,可以引入迭代器,進一步抽象。
template t sum(inputiterator first, inputiterator last, t start)
return start;
}
這樣我們分3
步完成了求和函式的泛型程式設計,正如你在上面看到的那樣,要實現泛型程式設計,必須理解兩個很重要的概念才行——模板
和迭代器
。
迭代器非常類似於指標,用於訪問容器中的各元素,而stl
中的迭代器,常作為容器和各種通用演算法函式的中介,這樣就不用為每種容器都專門寫乙個函式。
迭代器可以被分為5
種:輸入迭代器、輸出迭代器、前向迭代器、雙向迭代器、隨機訪問迭代器。下面是它們的分類依據:
輸入迭代器:只能單步向前迭代元素,不允許修改由該類迭代器引用的元素。
輸出迭代器:只能單步向前迭代元素,對元素只有寫的權力。
前向迭代器:擁有輸入迭代器和輸出迭代器的所有特性
雙向迭代器:在前向迭代器的基礎上提供了單步向後迭代元素的能力
隨機訪問迭代器:擁有上面4個迭代器的所有特性,而且可以像指標那樣進行算術計算,而不是僅僅只有單步向前或向後迭代。
在stl
中,各容器提供的迭代器種類如下:
vector
,deque
:隨機訪問迭代器
list
,set
,multiset
,map
,multimap
:雙向迭代器
stack
,queue
,priority_queue
:不支援任何迭代器
更加具體地分析,各種迭代器支援的操作如下:
所有迭代器:
輸入迭代器:
輸出迭代器:
前向迭代器:
雙向迭代器:
隨機訪問迭代器:
所謂就是模板,就是編寫類或者函式時先用乙個具有適配功能的佔位符
,在編譯時編譯器再對於各種具體型別再自動生成對應型別的類或者函式**的功能。
在c++11
中,模板可以被分為4
種:函式模板、類模板、成員模板、別名模板。
3.2.1.函式模板
比較兩個變數的大小:
template t max(const t &x, const t &y)
3.2.2.類模板
二維座標系上的點:
template class point
point(const point &other) : x_(other.x_), y_(other.y_) {}
//其他成員函式
};
3.2.3.成員模板
所謂成員模板就是任意類(不管是普通類還是模板類)中的模板類或者模板函式,即模板可以巢狀。比如為上面的二維點類增加乙個get
成員函式:
template class point
point(const point &other) : x_(other.x_), y_(other.y_) {}
//成員模板
template void get(u &dst_x, u &dst_y) const
};
3.2.4.別名模板
c++11
新引入的特性,其主要作用有兩個:
①固定模板的某些待匹配引數從而產生乙個更簡單易用的新模板:
template< typename first, typename second, int third>
class sometype;
template< typename second>
using typedefname = sometype;
②更方便地宣告函式指標的型別:
template< typename first, typename second, int third>
class sometype;
template< typename second>
using typedefname = sometype;
當然,你也可以把它當作typedef
來用
template using vec = std::vector;
vecv;
c 複習之泛型程式設計入門
目前感覺對泛型程式設計理解的不夠深,現主要對泛型簡單的應用做個總結。泛型程式設計主要包括 函式模板和類模板 1 函式模板 1.1函式模板定義及使用 template template 作為模板關鍵字,從原理上注意編譯器並不是把函式模板處理成任意型別的函式 而是編譯器把函式模板通過具體的型別產生不同的...
c 泛型程式設計
對於兩個不同的概念a和b,如果概念a所需求的所有功能也是概念b所需求的功能,那麼就說概念b是概念a的子概念。例如 標準模板庫 standard template library,簡稱stl 提供了一些非常常用的資料結構和演算法 將函式物件作為演算法的引數而不是將函式所執行的運算作為演算法的一部分。使...
C 泛型程式設計
1.模板介紹 泛型程式設計 指的是直接應用 使用模板編寫好的函式模板或類模板庫程式 進行程式設計。在具體使用時,程式設計師只需向使用的庫函式或類模板提供型別或值即可。模板是泛型程式設計的基礎。比如使用標準模板庫中的容器 迭代器進行程式設計,就是泛型程式設計。模板函式 模板函式 強調的是函式,函式使用...