10泛型演算法

2022-08-20 06:51:07 字數 3000 閱讀 1474

標準庫並未給每個容器都新增大量功能,而是提供了一組標準演算法,這些演算法中的大多數都獨立於任何特定的容器。這些演算法是通用的(generic 或稱為泛型的):它們可以用於不同型別的容器和不同型別的元素。

泛型演算法(generic algorithm)之所以稱為演算法,是因為它們實現了一些經典演算法的公共介面,如排序或搜尋;稱他們是泛型的,是因為它們可以用於不同型別的元素和多種容器型別。

三、lambda

呼叫運算子:如果可以對其使用呼叫運算子,則稱乙個物件是可以被呼叫的。

[capture list](parameter list) ->return type

capture list(捕獲列表)是乙個lambda所在函式中定義的區域性變數的列表(通常為空),其他與普通函式一樣。lambda必須使用尾置返回來指定返回型別。

lambda不能有預設引數,所以lambda呼叫的實參數目必須與形引數目相等。

(const string &a,const string b)

空捕獲列表表明lambda不使用它所在函式中的任何區域性變數。

stable_sort(words.begin(),words.end(), (const

string &a,const

string b)

auto wc = find_if(words.begin(),words.end(),[sz](const string &a));

指向第乙個長度大於給定引數sz的元素。如果不存在,則返回words.end()的乙個拷貝。

例 1.接受兩個int,返回它們的和。

auto sum = (int a,int b) ;

2.捕獲所在函式的int,並接受乙個int引數。返回捕獲int和int引數的和。

void add(int a);

}

3.1 lambda捕獲與返回

當向函式傳遞乙個lambda時,同時定義了乙個新型別與該型別的物件:傳遞的引數就是此編譯器生成的類型別的未命名物件。

類似引數傳遞,變數的捕獲方式也可以是值或者引用。

混合使用顯式捕獲和隱式捕獲:

&告訴編譯器捕獲引用方式; =告訴編譯器採用值捕獲方絲滑。

對於值捕獲,引數列表加上:mutabl

auto f =[v1] () mutable ;

乙個引用捕獲的變數能否修改取決於引用指向的變數時const 還是非const型別。

當需要為lambda指定返回型別時,必須使用尾置型別。

(int i) -> int

四、迭代器

插入迭代器

標準庫演算法為了保證通用性,並不直接操作容器,而是通過迭代器來訪問容器元素,演算法不具備直接向容器插入元素的能力,而插入器正式幫助演算法實現向容器插入元素的能力。有三種型別,區別在於元素插入位置不同。

原理:建立乙個使用push_back的迭代器。呼叫push_back.

功能:在容器的尾端插入元素。

限制:只有提供了push_back()成員函式的容器中,back_inserter才能派上用場。

適用:vector deque lis

原理:建立乙個使用push_front的迭代器。呼叫push_front.

功能:在容器前端插入元素

限制:只有提供了push_front()成員函式的容器中,form_inserter才能派上用場。

適用:deque list

原理:建立乙個使用insert的迭代器。此函式接受第二個引數,這個引數必須是乙個指向給定容器的迭代器。元素將被插入到給定迭代器所表示的元素之前。

功能:在容器的指定位置插入元素。

限制:只有提供了inset()成員函式的容器中,inserter才能派上用場,所有stl容器都提供了inset()函式。

適用:所有stl容器。

iostream迭代器

通過流迭代器,我們可以用泛型演算法從流物件讀取資料以及向其寫入資料。

istream_iterator:讀取輸入流

ostream_iterator:向乙個輸出流寫資料。

istream_iterator in_iter(cin);//

從cin讀取int

istream_iteratoreof; //

isteram尾後迭代器

while(in_iter !=eof)

vec.push_back(*in_iter++);

對於乙個繫結到流的迭代器,一旦關聯的流遇到檔案尾或遇到io錯誤,迭代器的值就與尾後迭代器相等。

ostream_iterator

ostream_iterator(t) out(os);    //

out將型別為t的值寫入到輸出流os中

ostream_iterator(t) out(os,d)//

out將型別為t值寫入到輸出流os中,每個值後面都輸出乙個d,d指向乙個空字元結尾的字元陣列。

void change(vector&vec)

以下**也能用來列印容器

ostream_iteratorout_iter(cout,"");

copy(vec.begin(),vec.end(),outiter);

五、泛型演算法結構

演算法要求的迭代器操作可以分為5個迭代器類別(iterator category),每個演算法都會對它的每個迭代器引數指明需要提供哪類迭代器。

C Primer 10 泛型演算法

1 include2 include3 include4 include 5 include6 using namespace std 78 void elimdups vector words 914 15void display vector words 1621 22int main 2330...

Chapter10 泛型演算法

泛型演算法的基礎是迭代器。迭代器令演算法不依賴於容器,但是演算法依賴於元素型別的操作。也即 演算法永遠不會執行容器的操作。那麼,如果想向容器中新增元素或者執行其他的一些操作呢?標準庫提供了插入迭代器來完成。但演算法自身永遠不會做這樣的操作。唯讀演算法 1 int sum accumulate vec...

C 泛型演算法

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