目錄10.2.2 寫容器元素的演算法
10.2.3 重排容器的演算法
常見的幾個唯讀演算法
find
count
accumulate
equal
accumulate前兩個引數接受乙個迭代器範圍,最後乙個引數接受初值
//對vector中的所有元素求和,和的初始值為0
int sum = accumulate(vec.cbegin(), vec.cend(), 0);
accumulate使用第三個引數作為求和的起點,隱含了兩個程式設計假定
第三個引數定義了「+」操作
迭代器範圍內的元素型別與第三個引數的型別匹配或者可以轉換為第三個引數
//v的型別是vectorstring sum = accumulate(v.cbegin(), v.cend(), ""); //錯誤,「」型別為const char *,沒有定義加法操作
string sum = accumulate(v.cbegin(), v.cend(), string(" "));
另乙個唯讀演算法是equal,用於確定兩個序列是否儲存相同的值。
它將第乙個序列中的每個元素與第二個序列中的對應元素進行比較。如果所有對應元素都相等,則返回true,否則返回false。
此演算法接受三個迭代器:前兩個(與以往一樣)表示第乙個序列中的元素範圍,第三個表示第二個序列的首元素:
//roster2中的元素數目應該至少與roster1中的一樣多
equal(rester1.cbegin(), roster1.cend(), roster2.cbegin());
重要的程式設計假設兩序列中的元素不必相同,只要能用「==」比較即可
那些只接受乙個單一迭代器來表示第二個序列的演算法,都假定第二個序列至少與第乙個序列一樣長。
寫操作寫入的元素的數目<=容器的大小;畢竟泛型演算法無法改變容器的大小
fill(vec.begin(), vec.end(), 0);//所有元素重置為0
//將乙個子串行設定為10
fill(vec.begin(), vec.begin()+vec.size()/2, 10);
vectorv; //空容器
fill_n(v.begin(), v.size(), 0); //正確:所有元素重置為0
fill_n(v.begin(), 10, 0); //錯誤:v是空容器
第二個操作的結果是未定義的
不要對空容器使用寫定義一種保證演算法有足夠元素空間來容納輸出資料的方法是使用插入迭代器( insertiterator)。向目的位置迭代器寫入資料的演算法假定目的位置足夠大,能容納要寫入的元素
插入迭代器是一種向容器中新增元素的迭代器。
通常情況,當我們通過乙個迭代器向容器元素賦值時,值被賦予迭代器指向的元素。而當我們通過乙個插入迭代器賦值時,乙個與賦值號右側值相等的元素被新增到容器中。
back_inserter()函式
back_inserter()定義在標頭檔案iterator中
vectorvec; //空向量
auto it = back_inserter(vec);//通過it賦值會新增元素
*it = 42;//現在vec中有乙個元素42
vectorvec;
fill_n(vec.begin(), 10, 0);//錯誤的:演算法不能改變容器大小
fill_n(back_inserter(vec), 10, 0);//正確的:插入迭代器會插入元素
copy()
algorithmname_copy()
//把ilst中的0替換為42
replace(ilst.begin(), ilst.end(), 0, 42);
replace(ilst.cbegin(), ilst.cend(), back_inserter(ivec), 0, 42);
//把ilst中的0替換為42,但ilst不會改變,而是把替換後的結果拷貝到ivec中
sort(迭代器範圍,比較函式)
:對容器進行排序
unique(迭代器範圍)
:將不重複元素放在開始部分,返回不重複區域的後乙個位置的迭代器
void elimdups(vector&words)
sort後:
unique後:
c primer之10 2 初識泛型演算法
標準庫提供了超過100個演算法,這些演算法都有一致的結構和類似的用法。除了少數例外,標準庫演算法都對乙個範圍內的元素進行操作。範圍分別用第乙個元素和尾元素之後位置的迭代器。理解演算法的最基本的方法就是了解他們是否讀取元素 改變元素或重排元素。10.2.1 唯讀演算法 有find和accumulate...
c primer學習筆記 初識泛型演算法
1概述 大多數演算法定義在標頭檔案algorithm中。一般情況下,這些演算法並不直接操作容器,而是遍歷迭代器指定的元素範圍。2迭代器使演算法不依賴於容器執行 雖然迭代器使用令演算法不依賴於容器型別,但大多數演算法都使用了乙個 或者多個 元素型別上的操作。關鍵在於 泛型演算法本身不會執行容器操作,只...
C 泛型演算法
標準庫並未給每個容器都定義成員函式來實現這些操作,而是定義了一組泛型演算法,稱他們為演算法是因為他們實現了一些經典演算法的公共介面,如排序和搜尋 稱他們為排序的是因為它們可以用於不同型別的元素和多種容器型別。大多數演算法都定義在標頭檔案algorithm中。標準庫還在標頭檔案numeric中定義了一...