C++ Primer 5th笔记(10)chapter10 泛型算法 :write
1. fill: 對給定區間全部賦予某值(algorithm.h)
將指定范圍內的每個元素都設定為給定的值。如果輸入范圍有效,則可以安全寫入。這個算法只會對輸入范圍內已存在的元素進行寫入操作。
template<class FwdIt, class T>
void fill(FwdIt first, FwdIt last, const T& x);
eg. “0 0 0 0 0 0 0”
vector<int> v2 = { 4,5,6,7,8,9,4 };fill(v2.begin(), v2.end(), 0);//將每個元素都重置為0for(auto it:v2)cout << " " << it;2. fill_n
對給定迭代器后的n個元素賦予某值。(從迭代器指向的元素開始,將指定數量的元素設置為給定的值)
template<class OutIt, class Size, class T>
void fill_n(OutIt first, Size n, const T& x);
eg.
fill_n(vec.begin(),n,val); vector<int> vec; fill_n(vec.begin(), 10, 0);//調用錯誤,fill_n并不是向容器中插入元素,它只負責更新元素的值。eg. “0 0 0 7 8 9 4”
vector<int> v2 = { 4,5,6,7,8,9,4 };fill_n(v2.begin(), 3, 0);//將每個元素都重置為0for (auto it : v2)cout << " " << it;3. back_inserter:
back_inserter 實參是一個容器的引用,返回一個綁定在該容器上的插入迭代器。
- 需要確保算法有足夠的元素存儲輸出數據 。
- 當對此迭代器賦值時,就push_back一個元素
eg. “4 5 6 7 8 9 4 0 0 0”
vector<int> v2 = { 4,5,6,7,8,9,4 }; fill_n(back_inserter(v2), 3, 0);//將每個元素都重置為0for (auto it : v2)cout << " " << it;4. copy
向目的位置迭代器指向的輸出序列中的元素寫入數據,接受三個迭代器(前兩個指定輸入范圍,第三個指向目標序列的第一個元素。長度同樣需要由程序員來保證)
template<class InIt, class OutIt>
OutIt copy(InIt first, InIt last, OutIt x);
copy算法帶有三個迭代器參數:
eg. “0 1 2 3 4 5 6”
5. replace
讀入一個序列范圍,將序列中某個值全部用一個新值來替換。
template<caass FwdIt, class T>
void replace(FwdIt first, FwdIt last, const T& vold, const T& vnew);
//該算法指定范圍[first, last)內的所有元素值為vold替換為vnew。
eg. “42 5 6 7 8 9 42”
vector<int> v2 = { 4,5,6,7,8,9,4 };int a1[] = { 0,1,2,3,4,5,6 }; replace(v2.begin(), v2.end(), 4, 42); for (auto it : v2)cout << " " << it;6.replace_copy
保留原序列不變,此算法額外接受第三個迭代器參數,指出調整后序列的保存位置。指定保存替換后的序列的目標位置, 替換后放在另外一個序列中
template<class InIt, class OutIt, class T>
OutIt replace_copy(InIt first, InIt last, OutIt x, const T& vold, const T& vnew);
eg. “42 5 6 7 8 9 42”
vector<int> v2 = { 4,5,6,7,8,9,4 };int a1[] = { 0,1,2,3,4,5,6 };vector<int> v3;replace_copy(v2.cbegin(), v2.cend(), back_inserter(v3), 4, 42);for (auto it : v3)cout << " " << it;7.sort重排元素
stable_sort排序算法是穩定排序。(algorithm.h)
template
void sort(RanIt first, RanIt last);
template<class RanIt, class Pred>
void sort(RanIt first, RanIt last, Pred pr);
template
void stable_sort(RanIt first, RanIt last);
template<class RanIt, class Pred>
void stable_sort(RanIt first, RanIt last, Pred pr);
eg.
using stable_sort: 3 apples winter winter1 apples1 2222222222222
using sort: 3 apples winter winter1 apples1 2222222222222
8.unique和unique_copy
-
unique函數執行重排的操作,并不包含“去”的過程(即不會刪除元素,算法不會改變容器大小)只是在有重復元素時,把后面的元素向前移動覆蓋了原來的元素。函數返回的迭代器指向無重復元素序列最后一個元素的下一個位置。
-
unique_copy是它的“_copy”版本,返回的是生成的序列的最后一個元素的下一個位置。(algorithm.h)
template
FwdIt unique(FwdIt first, FwdIt last);
template<class FwdIt, class Pred>
FwdIt unique(FwdIt first, FwdIt last, Pred pr);template<class InIt, class OutIt>
OutIt unique_copy(InIt first, InIt last, OutIt x);
template<class InIt, class OutIt, class Pred>
OutIt unique_copy(InIt first, InIt last, OutIt x, Pred pr);
注意:unique調用后,原序列的前面部分是無重復元素的序列,而后半部分是剩下沒有被覆蓋的序列。這里,需要手動刪除后面的元素序列,范圍由返回的迭代器和容器末端決定。
- 刪除一個空范圍沒有影響。
eg. “fox quick red slow the”
eg. “1 2 the quick red fox red the slow”
vector<string> wordsNew = { "1", "2" }; vector<string> words = { "the", "quick", "red", "fox","red", "the","slow" }; //Create an insert_iterator for results insert_iterator<vector<string> > ins(wordsNew, wordsNew.end());auto end_unique = unique_copy(words.begin(), words.end(), ins); //cout << " " << end_unique; for (auto it : wordsNew)cout << " " << it; std::cout << '\n';【引用】
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(10)chapter10 泛型算法 :write的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(10)
- 下一篇: C++ Primer 5th笔记(10)