c primer學習筆記 初識泛型演算法

2021-08-29 03:59:59 字數 1005 閱讀 6084

1概述

大多數演算法定義在標頭檔案algorithm中。一般情況下,這些演算法並不直接操作容器,而是遍歷迭代器指定的元素範圍。

2迭代器使演算法不依賴於容器執行

雖然迭代器使用令演算法不依賴於容器型別,但大多數演算法都使用了乙個(或者多個)元素型別上的操作。

關鍵在於:泛型演算法本身不會執行容器操作,只會執行在迭代器之上,執行迭代器的操作。泛型演算法執行於迭代器之上而不會執行容器操作的特性帶來了乙個令人驚訝但非常必要的程式設計假定:演算法永遠不會改變底層容器的大小。即演算法可能會改變容器中儲存的元素的值,也可能在容器中移動元素,但永遠不會直接新增或刪除元素。

3泛型演算法的分類

1)唯讀演算法

唯讀演算法指只會讀取其輸入範圍內的元素而不改變元素,如find就是這樣的一種演算法。對於唯讀演算法,通常使用cbegin()和cend()型別的迭代器。

accmulate演算法:三個引數,第三個引數作為求和的起點,這意味著序列中的元素型別必須和第三個引數匹配。

2)寫容器元素的演算法

寫演算法會將新值賦予序列中的元素。當我們使用這類演算法時,必須注意確保序列原大小至少不小於我們要求演算法寫入的元素數目。

如fill演算法:接收一對迭代器表示乙個範圍,還接收乙個值作為第三個引數,將這個給定的值賦予輸入序列的每個元素。

插入迭代器back_inserter: 插入迭代器是一種可以向容器中新增元素的迭代器。我們常常使用back_inserter來建立乙個迭代器,作為演算法的目的位置來使用。

vectorvec; //空向量

fill_n(back_inserter(vec),10,0);

拷貝演算法:是向目的位置迭代器指向的輸出序列中的元素寫入資料的演算法。該演算法接收三個迭代器,前兩個表示乙個輸入範圍,第三個表示目的序列的起始位置。

此演算法將輸入範圍中的元素拷貝到目的序列中,傳遞給copy的目的序列至少要包含和輸入序列一樣多的元素。

3)重排容器元素的演算法

某些演算法會重排容器中元素的順序,乙個明顯的例子是sort。

c primer之10 2 初識泛型演算法

標準庫提供了超過100個演算法,這些演算法都有一致的結構和類似的用法。除了少數例外,標準庫演算法都對乙個範圍內的元素進行操作。範圍分別用第乙個元素和尾元素之後位置的迭代器。理解演算法的最基本的方法就是了解他們是否讀取元素 改變元素或重排元素。10.2.1 唯讀演算法 有find和accumulate...

C Primer筆記 泛型演算法

地點 基地 泛型演算法並不直接操作容器,而是遍歷兩個迭代器指定的乙個元素範圍,如此將演算法是作用容器分離,實現通用性。泛型演算法多數定義在標頭檔案algorithm中。比如我們想在vector下找到乙個特定值,可實現如下 include include includeusing namespace ...

C primer筆記 泛型演算法

1 泛型演算法 演算法是因為其實現了一些經典演算法的公共介面,如排序和搜尋。泛型是因為他們可以作用於不同型別的元素和多種容器型別甚至是內建陣列。故稱泛型演算法 2 基本上都定義在algorithm和numeric兩個標頭檔案中,這些演算法遍歷由兩個迭代器指定的乙個元素範圍來進行操作,不對容器進行直接...