十一過完了..課一下子變的多了..每天都安排的滿滿的..~~也沒時間寫博文了.今天還算好,只有兩節課,...
----------------------------------------------------------------------------------------------------------------------------------------------------
真的是很佩服Alex那幫人.泛型思想,它的出現,使得C++不只是一門物件導向語言,,更是一門生命力如些之強的語言..它讓無數的人看到了,C++的閃光點...
佩服Alex,不只是它在泛型思想上做出了如此巨大的貢獻,,更加重要的是.他們那重孜孜不倦的工作太度,與研究,創新的精神...
任何科學技術的發展,都需要這樣的人...
----------------------------------------------------------------------------------------------------------------------------------------------------
1>什麼是泛型
其實就是很通用,,儘可能少的依賴於特定的條件.
泛型資料結構,指可以處理的資料類型不是唯一固定的,
泛型演算法,對它所操作的資料結構儘可能少的依賴,
2>迭代器的產生背景
當C++作為一個如此有生命力的語言出現時,,它的,對C語言相容性,物件導向思想,吸引了,很多優秀的工程師為之奮鬥,它們,經過很長時間的運用,探索,發現,每次都要寫很多沒有必要的東西(之前寫過無數次的),在這方面所花的時間,佔了他們工作的大時間,而且占的會越來越多.多麼可怕的事情..那麼,對於一種演算法,我能不能只把它的演算法思想表示出來..而不論我想把它用在什麼資料結構上,它都能正確的工作呢.??
這樣就慢慢出現了,模板和泛型演算法.
3>一個例子
現在,用一個最簡單的例子,來描述這個過程.
這是一個最簡的尋找演算法:
int lookup(int * array, int n, int value)
{
for(int i=0;i<n;i++)
{
if(*(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<class P,class T>
T lookup(P array,T value)
{
//...
}
這裡,用了模板,然後,把類P和T應有的行為封裝起來,(比如,移動,++,--這樣的操作)
很顯然,T是一個使用者類型,P是裝T類型的序列,
其實,我們這樣做已經很好了.只要一個類滿足一些條件(封裝了lookup中用到的方法),就能使用lookup進行尋找了.
可是,又出現了新的問題,也是開始提到的,P是裝的是T類型的序列,但是我用什麼去操作P對象呢,(總不能用T類型吧,這樣,那P的操作不也依賴於T類型了嗎)
5>,新問題的解決方案--------迭代器
template<class P ,class T>
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),隨機存取迭代器
提供的操作:
很明顯,從名子可是看得出來,這個是允許隨即訪問的,
在雙向迭代器的基礎上,加上了.+,-,+=,-=和[]操作.