泛型程式設計拾遺

2021-09-27 04:47:20 字數 1828 閱讀 7922

首先請大家思考乙個問題:以下6個問題可否共享一段**?

答案是肯定的。採用泛型程式設計對問題進行抽象,抽取出以上問題的共性即演算法(algorithm)、容器(container)和迭代器(itera),這也是stl(standard template library,標準模板庫)的三要素

1 template 23

void

process(iterator begin, iterator end, act act, test test)45

//對容器中在給定範圍內(即起於begin止於end)所有滿足給定條件的元素進行處理67

其中,演算法是一系列切實有效的步驟(act/test);容器是資料的集合,可以理解為抽象的陣列(6個問題中需要遍歷的資料集合);迭代器是演算法與容器之間的介面,可理解為抽象的指標或游標(迭代器用以訪問容器內元素,c++中指標就是一種迭代器)。以上程式中看不到元素的資料型別t,甚至也看不到存放資料的容器container,這是因為元素已經被容器封裝,而容器通過迭代器參與演算法。

1

//generic programming 范型程式設計 by acelit

2 #include 3 #include 4

using

namespace

std;

56 template

7void

process(iterator begin, iterator end, act act, test test)8//

對容器中在給定範圍內(即起於begin止於end)所有滿足給定條件的元素進行處理913

//判斷是否為非數字字元

14bool notdigit(char

c)15

18//

列印非數字字元

19void printnondigit(char

c)20

2324

intmain()

25

問題6中的標準輸入也是容器的一種,容器內元素型別為char,template <class iterator, class act, class test>通過模板泛化了容器(還有陣列、列表、集合、對映、佇列、棧、字串等),也泛化了元素(可以是任何資料型別),甚至泛化了處理方法和限定條件(迭代器本身就是一種檢查容器內元素並遍歷元素的資料型別,這種資料型別包含一組確定的操作來遍歷、訪問容器內的元素,當然遍歷方法有很多種了,比如從前往後、從後往前、隨機移動…)。

【泛化這個詞可以理解為『隱藏』,這裡模板內僅有迭代器的宣告,但是迭代器的型別是通過容器來定義的。】

istream_iterator表示元素為char型別的標準輸入流(容器)迭代器,()內有標準輸入流物件cin表示容器開始位置,為空表示容器結束位置。

怎麼樣?泛型程式設計是不是使**異常簡潔,當然付出的代價是理解起來比較抽象了,這裡完全看不到i/o讀取的過程,也看不到通常的迭代迴圈,使我們完全擺脫了底層編碼的細節,在更高、更抽象的層次上進行程式設計。

抽象和泛化使**簡潔高效、可重用性大大提高,是泛型程式設計的「屠龍之技」,也是我們必須掌握的程式設計技能。

歡迎討論交流o(∩_∩)o

istream_iterator詳見:

本文參考:《冒號課堂——程式設計正規化與oop思想》

C 拾遺系列 5 泛型委託

using system using system.collections.generic using system.linq using system.text namespace nettest 泛型委託 class testgenericdelegate public delegate voi...

《程式設計基礎(C語言)》拾遺

書名 程式設計基礎 c語言 第二版 編著者 張先偉 馬新娟 張立紅 王雲 田愛奎 學院的老師們 版次 2016 年 9 月 第2版 isbn 978 7 302 44086 4 出版社 清華大學出版社 這是我們程設課參考書 教材 自己突然興起想複習,溫故而知新嘛,並且總結總結,更深入的理解c語言吧。...

asp知識拾遺

最近做的乙個小 碰到了許多問題,能解決的都解決了,還有的沒辦法就找了替代的解決辦法.下面收集一下 1 在選擇了一系列的checkbox後的提交表單提交後,會獲取到name1,逗號,空格,name2,逗號,空格,結果,系統需要獲取這些值,我用了以下 實現.uname request.form user...