第11章 泛型演算法 8

2021-06-02 09:16:49 字數 1802 閱讀 2879

11.3.4 const迭代器

可以將迭代器定義為const_iterator型別,這樣做是因為我們不希望使用這個迭代器來修改容器中的元素。

11.3.5 五種迭代器

(1) 輸入迭代器(input iterator)可用於讀取容器中的元素,但是不保證能支援容器的寫入操作。輸入迭代器必須至少提供下列操作:

1. 相等和不等操作符(==,!=),比較兩個迭代器

2. 前置和後置的自增運算(++),使迭代器向前遞進指向下乙個元素。

3. 用於讀取元素的解引用操作符(*),此操作符只能出現在賦值運算的右運算元上。

4.箭頭操作符(->),這是(*it).member的同義語,也就是說,對迭代器進行解引用來獲取其所關聯的物件的成員。

要求在這個層次上提供支援的泛型演算法包括ind和accumulate。標準庫istream_iterator型別是輸入迭代器。

(2)輸出迭代器(output iterator) 可視為與輸入迭代器功能互補的迭代器;輸出迭代器可用來向容器寫入元素,但不保證能支援讀取容器內容。輸出迭代器要求:、

1. 前置和後置的自增運算(++),使迭代器向前遞進指向下乙個元素。

2. 解引用操作符(*),此操作符只能出現在賦值運算的左運算元上。給解引用的輸出迭代器賦值,將對該迭代器所指向的元素做寫入操作。

輸出迭代器可以要求每個迭代器的值必須正好寫入一次。使用輸出迭代器時,對於指定的迭代器值應該使用一次*運算,而且只能用一次。輸出迭代器一般用作演算法的第三個實參,標記寫入的位置。

標準庫ostream_iterator型別是輸出迭代器。

(3)前向迭代器(forward iterator)用於讀寫指定的容器。

這類迭代器只會以乙個方向遍歷序列。前向迭代器支援輸入迭代器和輸出迭代器提供的所有操作,除此之外,還支援對同乙個元素的多次讀寫。可複製前向迭代器來記錄序列中的乙個位置,以便將來返回此處。需要前向迭代器的泛型演算法包括replace。

(4) 雙向迭代器(bidirectional iterator)從兩個方向讀寫容器。除了提供前向迭代器的全部操作之外,雙向迭代器還提供前置和後置的自減操作(--)。需要使用雙向迭代器的泛型演算法包括reverse。所有標準庫容器提供的迭代器都至少達到了雙向迭代器的要求。

(5)隨機訪問迭代器(random-access iterator)提供在常量時間內訪問容器任意位置的功能。這種迭代器除了支援雙向迭代器的所有功能之外,還支援下面的操作:

1. 關係操作符<、<=、>和》=,比較兩個迭代器的相對位置。

2. 迭代器與整數數值n之間的加法和減法操作符+、+=、-、-=,結果是迭代器在容器中向前(或退回)n個元素。

3. 兩個迭代器之間的減法操作符(-),得到兩個迭代器間的距離。

4. 下標操作符iter[n],這是*(iter + n)的同義詞。

需要隨機訪問迭代器的泛型演算法包括sort演算法。vector、deque和string迭代器是隨機訪問迭代器,用作訪問內建陣列元素的指標也是隨機訪問迭代器。

map、set和list容器提供雙向訪問迭代器,而string、vector和deque容器上定義的迭代器都是隨機訪問迭代器,用作訪問內建陣列元素的指標也是隨機訪問迭代器。istream_iterator是輸入迭代器,而ostream_iterator則是輸出迭代器。

儘管map和set型別提供雙向迭代器,但關聯容器只能使用演算法的乙個子集。問題在於:關聯容器的鍵是const物件。因此,關聯容器不能使用任何寫序列元素的演算法。只能使用與關聯容器綁在一起的迭代器來提供用於讀操作的實參。

在處理演算法時,最好將關聯容器上的迭代器視為支援自減運算的輸入迭代器,而不是完整的雙向迭代器。

向演算法傳遞無效的迭代器類別所引起的錯誤,無法保證會在編譯時**獲到。

第11章 泛型演算法

泛型演算法本身從不執行容器操作,只是單獨依賴迭代器和迭代器操作實現。演算法從不直接新增或刪除元素。back inserter函式是迭代器介面卡,迭代器介面卡使用乙個物件作為實參,並生成乙個適應其實參行為的新物件。謂詞是做某些檢測的函式,返回用於條件判斷的型別,指出條件是否成立。三種插入迭代器的區別在...

第11章 泛型演算法 2

11.2 初窺演算法 使用泛型演算法必須包含algorithm標頭檔案。標準庫還定義了一組泛化的算術演算法 generalized numeric algorithm 其命名習慣與泛型演算法相同。使用這些演算法則必須包含numeric標頭檔案。11.2.1 唯讀演算法 vectorvec for i...

第11章 泛型演算法 4

11.2.3 對容器元素重新排序的演算法 stdafx.h include using namespace std bool isshorter const string s1,const string s2 bool gt6 const string s stdafx.cpp include st...