C primer筆記 泛型演算法

2021-08-26 12:03:20 字數 3334 閱讀 7621

1、泛型演算法:演算法是因為其實現了一些經典演算法的公共介面,如排序和搜尋。泛型是因為他們可以作用於不同型別的元素和多種容器型別甚至是內建陣列。故稱泛型演算法

2、基本上都定義在algorithm和numeric兩個標頭檔案中,這些演算法遍歷由兩個迭代器指定的乙個元素範圍來進行操作,不對容器進行直接操作

3、所謂泛型演算法就是作用於容器和元素上面的一些操作的合集,在實際情況中要善於使用

4、標準庫基本上都是對乙個範圍內的容器進行操作,所以引數中總會有兩個表示範圍的迭代器

5、accumulate函式接受三個引數,前兩個指出了需要求和的元素的範圍,第三個引數是和的初值,第三個引數的型別決定了函式中使用哪個加法運算子以及返回值的型別

6、用乙個單一迭代器表示第二個序列的演算法都假定第二個序列和第乙個序列等長,如果實際中不等長,程式會出現錯誤

7、fill()演算法的使用必須保證容器本身有足夠的大小

8、拷貝(copy)演算法接受三個迭代器,前兩個表示乙個輸入範圍,第三個表示目的序列的起始位置,此演算法將輸入範圍中的元素拷貝到目標序列中,傳遞給copy的目標序列至少要包含與輸入序列一樣多的元素

9、replace演算法接受4個引數:前兩個是迭代器,表示輸入序列,後兩個乙個是要搜尋的值,另乙個是新值,它將所有等於第乙個值的元素替換為第二個值

10、sort演算法接受兩個迭代器,表示要排序的元素範圍

11、unique演算法重排輸入序列,將相鄰的重複項「消除」(覆蓋),並返回乙個指向不重複值範圍末尾的迭代器

10、本階段所學到的一些泛型演算法:find()搜尋,accmulate()求和,equal()相等判斷,fill()、fill_n()賦值,back_insert()插入操作,copy()拷貝,sort()排序,unique()重排並消重複

11、很多演算法在預設情況下都會使用元素型別的《或者==運算子完成比較,但標準庫還為其定義了額外的版本,允許我們提供自己定義的操作代替預設的運算子,也就是說,向演算法傳遞函式

12、謂詞的定義:可呼叫的表示式,其返回結果是乙個能用作條件的值。接受謂詞引數的演算法對輸入序列中的元素呼叫謂詞。

13、排序演算法sort()-按大小重排,stable_sort()按大小排的同時,還按字典順序,同大小不變順序

14、我們希望對演算法進行更多引數的操作,衍生出lambda表示式,乙個lambda表示式表示乙個可呼叫**單元,它可以定義在函式的內部。

表示式的形式:f = 捕獲列表->返回型別,引數列表為空時,()可省略。

如果未指定返回內容,則lambda返回void。

捕獲列表是乙個lambda所在函式中定義的區域性變數的列表(通常為空),空捕獲列表表明此lambda不使用它所在函式中的任何區域性變數

15、lambda只有在捕獲列表中捕獲乙個它所在函式的區域性變數才能在函式體中使用該變數,lambda可以直接使用定義在函式之外的名字或者區域性static變數

16、partition()返回的是最後乙個使謂詞為true的元素的後乙個位置的迭代器

find_if()返回的是第乙個使謂詞返回非0值的元素,若不存在這樣的元素,則返回尾迭代器

17、lambda的捕獲方式:值捕獲、引用捕獲、隱式捕獲,在中,

值捕獲:**獲的變數在lambda建立時拷貝

引用捕獲:在lambda中使用引用捕獲的變數時,實際上所使用的是引用對應的變數,也就可以在lambda函式體內修改該值。但是由於lambda捕獲的是區域性變數,必須保證函式結束後、lambda所呼叫的區域性變數的位址仍然存在。

隱式捕獲:讓編譯器根據lambda體中的**推斷我們需要使用哪些變數。&表示引用捕獲,=表示值捕獲。顯示捕獲與隱式捕獲混合使用時,必須捕獲方式不同。

18、儘量減少捕獲的資料量,避免捕獲可能導致的結果,避免引用、指標捕獲。

本小節遇到的相關泛型演算法:stable_sort()排序時相等長度元素維持原有順序,partition()對容器進行劃分,使得謂詞為真的元素排在前面,返回最後乙個使謂詞為真的元素的後乙個位置的迭代器,find_if()查詢第乙個具有特定大小的元素

19、值捕獲想修改變數的話,可以在引數列表後加mutable進行修改。引用捕獲也必須是非const的變數才可以進行修改。

20、若不明顯指出返回型別,需要在引數列表之後使用尾置返回型別:->bool。

21、幾種特殊的迭代器—實際上相當於乙個泛型演算法,接受乙個容器作為引數,產生乙個迭代器,將元素插入容器之中

插入迭代器:這些迭代器繫結到容器上,可以用來向容器插入元素

流迭代器:繫結到輸入輸出流上,用來遍歷所有關聯的io流

反向迭代器:向後移動而不是向前移動,出了forward_list其他容器都有

移動迭代器:移動容器中的元素

22、插入器,接受乙個容器作為引數,生成乙個迭代器,可以向容器中新增元素。++it,it++,*it都不會產生任何效果,只能返回it(插入迭代器),it = t 在it指向的位置插入元素t。

23、插入迭代器分為三種:back_inserter()建立乙個使用push_back的迭代器,front_inserter()建立乙個push_front的迭代器,inserter()建立乙個insert迭代器,接受兩個引數。插入到指定迭代器之前。(前提是容器必須支援push_back()的操作

24、unique_copy():拷貝不重複元素,back_insert():插入迭代器(需包含iterator標頭檔案)

25、io迭代器將他們對應的流當作特定型別的元素序列來處理。通過使用流迭代器,可以用泛型演算法從流中物件讀取資料以及寫資料

26、反向迭代器,加上r,反向迭代器需要的是遞減運算子,操作會從cbegin()反向處理string

27、rbegin()指向的是最後乙個元素,rend()指向的是首元素之前的位置

28、通過呼叫反向迭代器的base()成員函式,可以將其轉換為對應的普通迭代器

29、反向迭代器++是遞減的運算子,向後移動,–是遞增的運算子,向前移動

30、輸入迭代器:可以讀取序列中的元素。

輸出迭代器,看作是輸入迭代器的補集,可寫。

前向迭代器:單向,支援輸入輸出。

雙向迭代器:雙向,支援讀寫,還支援遞增遞減運算子。

隨機訪問迭代器:基本支援所有功能。

31、sort()需要隨機訪問迭代器,所以不能用於list和forward_list.

31、對於list和forward_list應優先使用其成員函式版本的演算法,皆返回void.

32、remove()刪除元素,reverse()反轉元素順序,sort()排序,unique()刪除相同元素

33、鍊錶型別還定義了splice成員演算法,其實鍊錶資料結構所特有的,主要用於合併兩個鍊錶

C Primer筆記 泛型演算法

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

C Primer之泛型演算法lambda筆記

泛型演算法中有部分演算法除了第乙個和第二個引數接受迭代器型別來表示範圍外,它的第三個引數型別是乙個謂詞。謂詞是乙個可呼叫表示式,分為一元謂詞 只接受乙個引數 二元謂詞 接受兩個引數 比如說常用的sort演算法,它的第三個引數就是乙個二元謂詞。include include include inclu...

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

1概述 大多數演算法定義在標頭檔案algorithm中。一般情況下,這些演算法並不直接操作容器,而是遍歷迭代器指定的元素範圍。2迭代器使演算法不依賴於容器執行 雖然迭代器使用令演算法不依賴於容器型別,但大多數演算法都使用了乙個 或者多個 元素型別上的操作。關鍵在於 泛型演算法本身不會執行容器操作,只...