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

來源:互聯網
上載者:User

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

 

----------------------------------------------------------------------------------------------------------------------------------------------------

 

         真的是很佩服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),隨機存取迭代器

 

    提供的操作:

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.