天天看點

C++ Primer 學習筆記_45_STL實踐與分析(19)--泛型算法的結構STL實踐與分析

引言:

正如全部的容器都建立在一緻的設計模式上一樣,算法也具有共同的設計基礎。

    算法最主要的性質是須要使用的疊代器種類。全部算法都指定了它的每一個疊代器形參可使用的疊代器類型。比方,假設形參必須為随機訪問疊代器則可提供vector或

deque類型的疊代器,或者提供指向數組的指針。而其它容器的疊代器不能用在這類算法上。

 c++還提供了另外兩種算法模式:一種模式由算法所帶的形參定義;還有一種模式則通過兩種函數命名和重載的規範定義。

一、算法的形參模式

 大多數的算法都採用以下四種形參模式:

   當中,alg是算法的名字,beg和end指定算法操作的元素範圍。我們通常将該範圍成為算法的“輸入範圍”。

1、帶有單個目标疊代器的算法

 dest形參是一個疊代器,用于指定存儲輸出資料的目标對象。

調用這些算法時,必須確定輸出容器有足夠大的容量存儲輸出資料。

    假設dest是容器上的疊代器,則算法将輸出内容寫到容器中已存在的元素上。更普遍的使用方法是,将dest與某個插入疊代器或者ostream_iterator綁定在一起。插入疊代器在容器中加入元素,以確定容器有足夠的空間存儲輸出。ostream_iterator則實作寫輸出流的功能,無須要考慮所寫的元素個數。

2、帶第二個輸入序列的算法

有一些算法帶有一個beg2疊代器形參,或者同一時候帶有beg2和end2疊代器形參,來指定他的第二個輸入範圍,此時,算法完整地制定了兩個範圍:beg和end标記第一個輸入範圍,而beg2和end2則标記第二個輸入範圍。

    與寫入dest的算法一樣,僅僅帶有beg2的算法也假定一beg2開始的序列與beg和end标記的序列一樣大!

二、算法的命名規範

标準庫使用了兩種重要的算法命名和重載規範:

  1)第一種模式包含測試輸入範圍内的元素的算法

  2)另外一種模式應用于對輸入範圍内元素又一次排序的算法【不是非常了解】

1、差别帶有一個值或一個謂詞函數參數的算法版本号

非常多算法通過檢查其輸入範圍内的元素實作其功能。當中的大部分算法會提供第二個版本号的函數,同意程式猿提供比較或測試函數代替操作符(<或==)的使用。

檢查指定值的算法預設使用==操作符。系統為這類算法提供另外命名的(而非重載的)版本号:

    帶有謂詞函數形參的算法,其名字帶有一個_if字尾。當中,find_if算法用于查找一個使謂詞函數pred傳回非零值的元素。

2、差别是否實作複制的算法版本号

不管算法是否檢查它的元素值,都可能又一次排列輸入範圍内的元素。在預設情況下,這些算法将又一次排列的元素寫回其輸入範圍。标準庫也為這些算法提供另外命名的版本号,将元素寫到指定的輸出目标。此版本号的算法在名字中加入了_copy字尾:

繼續閱讀