大雜院 STL中的泛型思想與迭代器家族

2021-05-23 08:53:26 字數 2049 閱讀 9396

十一過完了..課一下子變的多了..每天都安排的滿滿的..~~也沒時間寫博文了.今天還算好,只有兩節課,...

真的是很佩服alex那幫人.泛型思想,它的出現,使得c++不只是一門物件導向語言,,更是一門生命力如些之強的語言..它讓無數的人看到了,c++的閃光點...

佩服alex,不只是它在泛型思想上做出了如此巨大的貢獻,,更加重要的是.他們那重孜孜不倦的工作太度,與研究,創新的精神...

任何科學技術的發展,都需要這樣的人...

1>什麼是泛型

其實就是很通用,,盡可能少的依賴於特定的條件.

泛型資料結構,指可以處理的資料型別不是唯一固定的,

泛型演算法,對它所操作的資料結構盡可能少的依賴,

2>迭代器的產生背景

當c++作為乙個如此有生命力的語言出現時,,它的,對c語言相容性,物件導向思想,吸引了,很多優秀的工程師為之奮鬥,它們,經過很長時間的運用,探索,發現,每次都要寫很多沒有必要的東西(之前寫過無數次的),在這方面所花的時間,佔了他們工作的大時間,而且佔的會越來越多.多麼可怕的事情..那麼,對於一種演算法,我能不能只把它的演算法思想表示出來..而不論我想把它用在什麼資料結構上,它都能正確的工作呢.??

這樣就慢慢出現了,模板和泛型演算法.

3>乙個例子

現在,用乙個最簡單的例子,來描述這個過程.

這是乙個最簡的查詢演算法:

int lookup(int * array, int n, int value)

for(int i=0;iif(*(p++) == value)

return i;

return -1;

這裡有幾個問題:

1),我的演算法只針對 int 型的序列有效(演算法和資料結構的依賴關係);

2),我的演算法引用資料結構,這時我的資料結構安全性很低,(沒有對外界操作進行限制)

3),我的 array 結構,和n有很大的依賴關係(n為array中結點的個數);(引數之間有依賴關係)

4),我的 srray 結構必需是順序存放的(演算法本身與資料結構的實現形式有依賴關係)

5),我的演算法內部用了i作為位置的標識,(演算法相當然的給資料結構加了操作)

6),我的演算法 沒找到返回是-1,(這又是按自己的意願,加了一層,演算法和資料結構之間的依賴)

4>stl中的解決方法

1),首先,針對上面的2,3,4問題(不是太絕對),我們可是用類對其進行封裝,

2),對於1,5,6問題,我們可以用模板(template)實現,

template

t lookup(p array,t value)

這裡,用了模板,然後,把類p和t應有的行為封裝起來,(比如,移動,++,--這樣的操作)

很顯然,t是乙個使用者型別,p是裝t型別的序列,

其實,我們這樣做已經很好了.只要乙個類滿足一些條件(封裝了lookup中用到的方法),就能使用lookup進行查詢了.

可是,又出現了新的問題,也是開始提到的,p是裝的是t型別的序列,但是我用什麼去操作p物件呢,(總不能用t型別吧,這樣,那p的操作不也依賴於t型別了嗎)

5>,新問題的解決方法--------迭代器

template

p::iterator & lookup(p array, t array)

這樣,p容器類的各種操作都是p::iterator這個叫做迭代器的傢伙實現的(插入,取出,移動等等..)

6>,stl中的迭代器

//約定:p,q為迭代器

1),輸入迭代器

提供的操作:

取元素 *p ,移動位置 p++(++p) ,判斷位置 p==q(p!=q),

2),輸出迭代器

提供的操作:

*p可以對對應的元素進行修改(明顯,輸入應該禁止掉修改)

3),前向迭代器

提供的操作:

輸入和輸出迭代器的結合

4),雙向迭代器

提供的操作:

在前向的基礎上,加了可以向前移動的能力(p--和--p)

5),隨機訪問迭代器

提供的操作:

很明顯,從名子可是看得出來,這個是允許隨即訪問的,

在雙向迭代器的基礎上,加上了.+,-,+=,-=和操作.

深入解讀Lua中迭代器與泛型for的使用

泛型for原理 迭代器是一種可以遍歷集合中所有元素的機制,在lua中通常將迭代器表示為函式,每呼叫一次函式,就返回集合中 下乙個 元素。每個迭代器都需要在每次成功呼叫之間保持一些狀態,這樣才能知道它所在的位置及如何步進到下乙個位置,closure就可以完成此項工作。下面的示例是列表的乙個簡單的迭代器...

使用STL中的泛型演算法及函式物件

使用了vector容器,remove if for each 等演算法,並使用到了函式物件。vector容器中存放的是多個欄位的結構體,然後根據結構體的某個字段刪除其在容器中的元素。主要是用於練習使用stl中的泛型演算法 include stdafx.h include include includ...

Swift中協議與泛型的應用

1.方法的泛型 泛型約束 冒號後邊跟class或者協議,傳入的引數somet和someu必須是遵循該協議或類 naarray類,comparable協議 func somefunction somet t,someu u func compartwo a t,b t bool與oc中的id有點類似,...