10.4.3反向迭代器Reverse_iterator筆記
阿新 • • 發佈:2019-01-29
反向迭代器就是在容器中
從尾元素向首元素反向移動的迭代器。對於反向攜帶器,遞增(以及遞減)操作的含義會顛倒過來。遞增一個反向迭代器(++it)會移動到前一個元素;遞減一個迭代器(--it)會移動到下一個元素。
從尾元素向首元素反向移動的迭代器。對於反向攜帶器,遞增(以及遞減)操作的含義會顛倒過來。遞增一個反向迭代器(++it)會移動到前一個元素;遞減一個迭代器(--it)會移動到下一個元素。
反向輸出經過排序後的vector
將名為line的string,最後一個逗號之後的單詞列印ostream_iterator<int> out_iter(cout, " "); vector<int> vec = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; sort(vec.rbegin(), vec.rend()); for (auto r_iter = vec.crbegin(); r_iter != vec.crend(); ++r_iter) *out_iter++ = *r_iter; cout << endl;
string line{ "FIRST, MIDDLE,LAST" };
auto rcomma = find(line.crbegin(), line.crend(), ',');
cout << string(line.crbegin(), rcomma) << endl;//輸出TSAL
cout << string(rcomma.base(), line.cend()) << endl;//輸出LAST,呼叫了reverse_iterator 中的base成員函式來完成這一轉換
10.5.3演算法命名規範
一些演算法使用過載形式傳遞一個謂詞
Unique(beg, end); //使用==運算子比較元素
Unique(beg, end, comp); //使用comp比較元素
_if版本演算法接受一個元素之的演算法通常有另一個不同名的(不是過載版本的)版本,該版本接受一個謂詞代替元素值,接受謂詞引數的演算法都有附加的_if字首:
find(beg, end, val); // 查詢輸入範圍中val第一次出現的位置
find_if(beg, end, pred); //查詢第一個令pred為真的元素
區分拷貝元素的版本和不拷貝元素的版本預設情況下,重排元素的演算法將重排後的元素寫回給定的輸入序列中。這些演算法還提供另一個版本,將元素寫到一個指定的輸出目的位置。如我們所見,寫到額外目的的空間的演算法都在名字後面附加一個_copy
reverse(beg, end); //反轉輸入範圍中元素的順序
reverse_copy(beg, end, dest); //將元素按逆序拷貝到dest
一些演算法同時提供_copy和_if版本。這些版本接受一個目的位置迭代器和一個謂詞
remove_copy_if(vec.cbegin(), vec.cend(), out1_iter, [](int i) { return i % 2; });
//將偶元素拷貝到檔案1,vec不變,使得lambda為真的條件是i為奇數,remove將使得謂詞為真的元素刪除,然後將剩餘元素拷貝到檔案1,所以是將偶數拷貝到檔案1中
remove_copy_if(vec.cbegin(), vec.cend(), out2_iter, [](int i) { return !(i % 2); });
//將奇元素拷貝到檔案2,vec不變,使得lambda為真的條件是i為偶數,remove將使得謂詞為真的元素刪除,然後將剩餘元素拷貝到檔案2,所以是將奇數拷貝到檔案2中10.6特定容器的演算法
Lst.merge(lst2) Lst.metge(lst2, comp) | 將來自lst2的元素合併入lst。Lst和lst2都必須是有序的,元素將從lst2中刪除。在合併之後,lst2變為空。第一個版本使用<運算子;第二個版本使用給定的比較操作 |
Lst.remove(val) Lst.remove_if(pred) | 呼叫erase刪除掉與給定值相等(==)或令一元謂詞為真的每個元素 |
Lst.reverse() | 反轉lst中的元素的順序 |
Lst.sort() Lst.sort(comp) | 使用<或給定的比較操作排序元素 |
Lst.unique() Lst.unique(pred) | 呼叫erase刪除同一個值得連續拷貝。第一個版本使用==;第二個版本使用給定的二元謂詞 |