10 5 泛型演算法結構

2022-09-25 14:57:10 字數 2608 閱讀 4591

目錄10.5.2 演算法的形參模式

10.5.3 演算法的命名規範

按操作分類,形成了一種層次,高類別的迭代器支援低類別的所有操作

對於向乙個演算法傳遞錯誤類別的迭代器的問題,很多編譯器不會給出任何警告或提示。

輸入迭代器必須支援

輸入迭代器只用於順序訪問

對於乙個輸入迭代器,*it++保證是有效的,但遞增它可能導致所有其他指向流的迭代器失效。其結果就是,不能保證輸入迭代器的狀態可以儲存下來並用來訪問元素。

因此,輸入迭代器只能用於單遍掃瞄演算法。演算法 find和 accumulate要求輸入迭代器;而istream_iterator是一種輸入迭代器。

輸出迭代器必須支援:

我們只能向乙個輸出迭代器賦值一次。類似輸入迭代器,輸出迭代器只能用於單遍掃瞄演算法。用作目的位置的迭代器通常都是輸出迭代器。

例如,copy函式的第三個引數就是輸出迭代器。ostream_iterator型別也是輸出迭代器。

可以讀寫元素。這類迭代器只能在序列中沿乙個方向移動

前向迭代器支援所有輸入和輸出迭代器的操作,而且可以多次讀寫同乙個元素

因此,我們可以儲存前向迭代器的狀態,使用前向迭代器的演算法可以對序列進行多遍掃瞄

演算法replace要求前向迭代器,forward_list上的迭代器是前向迭代器。

可以正向/反向讀寫序列中的元素。

除了支援所有前向迭代器的操作之外,雙向迭代器還支援前置和後置遞減運算子(--)

演算法 reverse要求雙向迭代器,除了forward_list 之外,其他標準庫都提供符合雙向迭代器要求的迭代器。

提供在常量時間內訪問序列中任意元素的能力。此類迭代器支援雙向迭代器的所有功能,此外還支援如下的操作:

演算法sort要求隨機訪問迭代器。array、deque、string 和 vector的迭代器都是隨機訪問迭代器,用於訪問內建陣列元素的指標也是。

大多數演算法具有如下四種形式之一

其中alg是演算法的名字,beg和 end表示演算法所操作的輸入範圍。

幾乎所有演算法都接受個輸入範圍,是否有其他引數依賴於要執行的操作。

這裡列出了常見的一種——destvbeg2和 end2,都是迭代器引數。顧名思義,如果用到了這些迭代器引數,它們分別承擔指定目的位置和第二個範圍的角色。除了這些迭代器引數,一些演算法還接受額外的、非迭代器的特定引數。

dest引數是乙個表示演算法可以寫入的目的位置的迭代器。演算法假定(assume):按其需要寫入資料,不管寫入多少個元素都是安全的。

保證寫入的目標容器有足夠的空間是程式設計師的責任,通常會將dest設定為插入迭代器,這樣就能保證空間是足夠的

接受單獨beg2的演算法假定從 beg2開始的序列與beg和end所表示的範圍至少一樣大。

除了引數規範,演算法還遵循一套命名和過載規範。

這些規範處理諸如:如何提供乙個操作代替預設的《或==運算子以及演算法是將輸出資料寫入輸入序列還是乙個分離的目的位置等問題。

接受謂詞引數來代替《或==運算子的演算法,以及那些不接受額外引數的演算法,通常都是過載的函式。

unique(beg, end);//使用==比較元素

unique(beg, end, comp); //使用謂詞比較元素

接受乙個元素值的演算法通常有另乙個不同名的(不是過載的)版本,該版本接受乙個謂詞代替元素值。

find(beg, end, val);  //查詢輸入範圍中第乙個val的位置

find(beg, end, pred); //查詢第乙個令pred為真的元素的位置

預設情況下,重排元素的演算法將重排後的元素寫回給定的輸入序列中。

這些演算法還提供另乙個版本,將元素寫到乙個指定的輸出目的位置。此時需要加字尾_copy

reverse(beg, end); //反轉輸入範圍中的元素

reverse_copy(beg, end, dest); //將元素逆序拷貝到dest

有些演算法同時提供_copy和_if版本

//刪除v1中的奇數元素

remove_if(v1.begin(), v1.end(), (int i));

//將偶數元素從v1拷貝到v2;v1不變

remove_copy_if(v1.begin(), v1.end(), back_inserter(v2),

(int i));

泛型演算法結構

任何演算法的最基本的特性是它要求其迭代器提供哪些操作。某些演算法,如find,只要求通過迭代器訪問元素 遞增迭代器以及比較兩個迭代器是否相等這些能力。其他一些演算法,如sort,還要求讀 寫和隨機訪問元素的能力。演算法所要求的迭代器操作可以分為5個迭代器類別,如表所示 迭代器類別 輸入迭代器 唯讀,...

泛型結構使用大全(泛型類 泛型介面)

1 泛型類可能有多個引數,此時應將多個引數一起放到尖括號內,比如 2 泛型類的構造器如下 public genericclass 錯誤示例 public genericclass 3 例項化後,操作原來泛型位置的結構必須與指定的泛型型別一致。4 泛型不同的引用不能互相賦值。儘管在編譯時arrayli...

C 泛型演算法

標準庫並未給每個容器都定義成員函式來實現這些操作,而是定義了一組泛型演算法,稱他們為演算法是因為他們實現了一些經典演算法的公共介面,如排序和搜尋 稱他們為排序的是因為它們可以用於不同型別的元素和多種容器型別。大多數演算法都定義在標頭檔案algorithm中。標準庫還在標頭檔案numeric中定義了一...