1. 程式人生 > >Chapter10(泛型算法)--C++Prime筆記

Chapter10(泛型算法)--C++Prime筆記

div 運算 賦值 lambda 取數 編譯 混合 height 不支持

關鍵:算法通過在叠代器上進行操作來實現類型無關。算法不改變所操作序列的大小。
1.算法大多都定義在algorithm頭文件中,標準庫還在頭文件numeric中定義了一組數值泛型算法。
2.泛型算法永遠也不會改變底層容器的大小。
3.用一個單一叠代器表示第二個程序的算法都假定第二個序列至少與第一個一樣長。
4.插入叠代器:當我們通過一個插入叠代器賦值時,一個與賦值號右側值相等的元素被添加到容器中。
5.多個算法都提供所謂的拷貝版本。這些算法計算新元素的值,但不會將它們放置在輸入序列的末尾,而是創建一個新序列保存這些結果。
6.渭詞:是一個可調用的表達式,其返回結果是一個能用作條件的值。
7.lambda表達式:
[捕獲列表](參數列表)->return type{function body};捕獲列表是一個lambda所在函數定義的局部變量的列表。①可以忽略參數列表和返回類型,都是必須包含捕獲列表和函數體②忽略括號和參數列表等價於指定一個空參數列表。③如果忽略返回類型,假如函數體只有一個return語句,則返回類型從返回的表達式的類型推斷而來,否則,其他任何情況,返回類型為void.④lambda不能有默認參數⑤捕獲列表只用於局部非靜態變量,lambda可以直接使用局部static變量和它所在函數之外聲明的名字。⑥隱式捕獲:&告訴編譯器采用捕獲引用方式,=則采用值捕獲方式。如果我希望對一部分變量采取值捕獲,其他采用引用捕獲,可以混合使用隱式捕獲和顯示捕獲。
⑦當我們需要為一個lambda定義返回類型時,必須使用尾置返回類型。
8.標準庫函數blind可以將函數適配參數的數量和順序。blind和ref和cref均在functional頭文件中。
9.插入叠代器:①執行*it,it++,++it之類的操作後不會對叠代器做任何事情,每個操作還是返回it.②back_inserter:調用push_back. front_inserter:調用push_front,inserter元素被插入到給定叠代器所表示的的元素之前。③front_inserter元素總是插入到容器第一個元素之前。因此用copy時,最後目的位置用front——inserter時會使拷貝逆序。

10.iostream叠代器:如果定義一個iostream叠代器的時候默認初始化叠代器,這樣就創建了一個可以作為尾後值使用的叠代器。例子:istream_iterator<int>in_iter(cin),eof;vector<int> vec(in_iter,eof);這樣這個容器vec就是由關聯的流中讀取數據獲得的。
每次向一個out_iter賦值時,寫操作就會被提交
11.流叠代器不支持遞減運算。
12.對於list和forward_list應該優先使用成員函數版本的算法而不是通用算法。
13.鏈表特有版本和通用版本間的一個至關重要的區別就是鏈表版本會改變底層的容器。

Chapter10(泛型算法)--C++Prime筆記