重排容器元素的演算法
泛型演算法
大多數演算法都定義在標頭檔案algorithm中,標準庫的標頭檔案numeric中定義了一組數值型演算法。泛型演算法的作用是通過迭代器間接訪問容器,不會執行容器的操作,只執行在迭代器之上,迭代器可以做什麼,泛型演算法就可以做什麼。 迭代器演算法不依賴於容器,但演算法依賴於元素型別的操作。
關於迭代器引數:常見的迭代器引數有a.begin()和a.end(),如果出現一些演算法從兩個序列中讀取元素,構成這兩個序列的元素可以來自不同型別的容器。第乙個序列可能存於乙個vector,第二個序列可能儲存於乙個list、deque、內建陣列或其他容器中。兩個序列中的演算法也不完全匹配,但演算法要求的知識能夠比較兩個序列中的元素。
當操作兩個序列的演算法要求比較兩個序列中的元素時,比如equal演算法,接受三個迭代器,前兩個表示第乙個序列迭代器的範圍,第三個表示第二個迭代器的首元素。
上述用單一迭代器表示第二序列的演算法都假定第二序列至少比第一序列長。若比第乙個短,則造成第二序列中末尾之後(不存在)的元素和第一序列比較。確保演算法不會試圖訪問第二序列不存在的元素是程式設計師的責任。
fill_n演算法
vectorvec; //空向量
// 災難;修改vec中的10個(不存在)元素
fill_n(vec.begin(), 10, 0);
這個呼叫是一場災難,指定寫入10個元素,但vec中並沒有元素–他是空的。
因此向目的位置迭代器寫入資料的演算法假定目的的位置足夠大,能容納要寫入的元素。
標頭檔案:iterator
屬性:迭代器、演算法
作用:向容器中新增元素
優點:能保證演算法有足夠元素空間來容納輸入資料
執行原理:back_inserter接受乙個指向容器的引用,返回乙個於該容器繫結的插入迭代器。通過迭代器賦值時,賦值運算子通過呼叫push_back將乙個具有定值的元素新增到容器中(注意不是演算法新增,而是呼叫的push_back)。
例子:
vectorvec; //空向量
// 正確:back_inserter建立乙個插入迭代器,可用來向vec新增元素
fill_n(back_inserter(vec) ,10, 0); //新增10個元素到vec
拷貝並儲存在輸入序列末尾
如copy演算法:
作用:向目的位置迭代器 指向的 輸入序列中的元素 寫入資料
組成:接受三個迭代器,前兩個表示乙個輸入範圍,第三個表示目的序列的起始位置。
注意事項:傳遞給copy的目的序列至少要包含與輸入序列一樣多的元素。
例子:
int a1[ ] = ;
int a2[ ] = ; // a2與a1大小一樣(即注意事項)
// 拷貝的最後 ret指向了a2的尾元素之後的位置
auto ret = copy(begin(a1), end(a1), a2); //把a1的內容拷貝給a2
拷貝並建立新的序列
replace演算法
作用:讀取乙個序列,並將其中所有等於給定值的元素都改為另乙個值
組成:接受4個引數。前倆個是迭代器,表示輸入序列,後兩個是要搜尋的值,另乙個是新值。它將所有等於第乙個值的元素替換成第二個值。
例子:
// 將所有值為0的元素改為42
replace(list.begin(), list.end(), 0, 42);
若想保留原序列不變,可以呼叫replace_copy演算法,此演算法接受第三個迭代器引數。
例子:
//使用back_inserter按需要增長目標序列
replace_copy(list.cbegin(), ilst.cend(),
back_inserter(ivec), 0, 42);
呼叫之後,ilst並未改變,ivec是ilst的乙份拷貝,只是其中的0變成了42。
該類演算法的作用是:將容器中的元素重新排序。
如sort演算法:用法詳細可參考c+±algorithm 標頭檔案排序sort
作用:可以對類,結構體等元素進行排序。
原理:利用元素型別的」<「運算子實現排序。
例子:
假定有乙個vector,儲存了多個故事的文字,現在要簡化,,使每個單詞只出現一次,而不管單詞在文件**現多少次。
簡單故事輸入為: the quick red fox jumpe over the slow red turtle
為了消除多餘的元素採用了以下策略:
①利用sort演算法進行整體排序,生成的順序如下:
foxjumps
over
quick
redred
slow
thethe
turtle
②利用unique演算法使得相鄰重複項調整,使其多餘項置於容器「末端」,故返回乙個指向不重複值範圍末尾的迭代器,end_unique指向最後乙個不重複元素之後的位置。生成順序為:
foxjumps
over
quick
redslow
theturtle
??????
③利用erase函式刪除多餘元素,範圍為(end_unique, words.end())。
程式為
void elimdups(vector&words)
C Primer筆記 泛型演算法
地點 基地 泛型演算法並不直接操作容器,而是遍歷兩個迭代器指定的乙個元素範圍,如此將演算法是作用容器分離,實現通用性。泛型演算法多數定義在標頭檔案algorithm中。比如我們想在vector下找到乙個特定值,可實現如下 include include includeusing namespace ...
C primer筆記 泛型演算法
1 泛型演算法 演算法是因為其實現了一些經典演算法的公共介面,如排序和搜尋。泛型是因為他們可以作用於不同型別的元素和多種容器型別甚至是內建陣列。故稱泛型演算法 2 基本上都定義在algorithm和numeric兩個標頭檔案中,這些演算法遍歷由兩個迭代器指定的乙個元素範圍來進行操作,不對容器進行直接...
C primer學習 泛型演算法 3
auto f const int a,const int b cout f 12,13 endl for each也是一種演算法,可以用for代替 void biggies s words,string size type sz 按長度排序 找到第乙個 auto wz find if words.b...