C 知識點28 使用C 標準庫(再談迭代器)

2021-10-09 08:12:11 字數 3628 閱讀 6784

一、迭代器的種類

c++中的容器以及泛型演算法會大量的使用迭代器

目前已經出現的迭代器有一下幾種

1.輸出迭代器 (outputiterator)

輸出迭代器類似於輸出流(只能向輸出流中寫入資料),只能向輸出迭代器中寫入資料,輸出迭代器的常用操作如下

2.輸入迭代器 (inputiterator)

輸入迭代器類似於輸入流(變數只能讀取輸出流中的資料),只能向輸出迭代器中寫入資料,輸入迭代器的常用操作如下

3.前向迭代器 (forwarditerator)

加強版的輸入迭代器,可以對前向迭代器進行賦值,如果乙個前向迭代器不是const的,那麼也具有輸入迭代器的功能

c++標準庫中的單向鍊錶(forward_list)和無序容器的實現提供了前向迭代器,當然,無序容器也的實現也可以提供雙向迭代器

4.雙向迭代器 (bidirectionaliterator)

加強版的前向迭代器,提供了遞減操作符,可以一步一步後退迭代器

在前向迭代器的基礎上,新增的操作如下:

c++標準庫中的雙向鍊錶(list)和關聯容器的實現提供了雙向迭代器

5.隨機訪問迭代器 (randomaccessiterator)

加強版的雙向迭代器,在雙向迭代器的基礎上增加了隨機訪問的能力,能夠使迭代器增減某個偏移量,並且新增了比較操作

新增操作如下

c++標準庫中的vector,deque,string以及指標提供了隨機訪問迭代器

使用隨機訪問迭代器時,需要注意不能讓迭代器的位置超過end(),因為隨機訪問迭代器提供了前進n個元素的操作,所以在使用隨機訪問迭代器遍歷容器的時,迴圈條件要寫成it

上述五中迭代器,最最常用的是隨機訪問迭代器和雙向迭代器,因為這兩中迭代器由c++標準庫中的主要容器提供使用,然後是前向迭代器,因為在使用迭代器時都是伴隨這容器一起使用,所以輸入輸出迭代器一般情況用不到,在前面的部落格中也會發現,輸入輸出迭代器一般用於指定容器成員函式和泛型演算法函式的形參型別

二、五中迭代器的關係

1.所有前向,雙向和隨機訪問迭代器也是有效的輸入迭代器。

2.所有非const的前向,雙向和隨機訪問迭代器也是有效的輸出迭代器。

3.所有雙向和隨機訪問迭代器也是有效的前向迭代器。

4.所有隨機訪問迭代器也是有效的雙向迭代器。

5.就功能而言,隨機訪問迭代器是最完整的迭代器。 所有指標型別也是有效的隨機訪問迭代器。

上述五點中用圖形來描述如下圖

正是因為有上述關係,當我們使用c++標準庫中以輸入輸出迭代器為形參的泛型演算法函式或者容器的成員函式時,可以傳入前向迭代器或者雙向迭代器或者隨機訪問迭代器引數

同樣,當我們使用c++標準庫中以前向雙向迭代器為形參的泛型演算法函式或者容器的成員函式時,可以傳入隨機訪問迭代器引數

當函式的返回值是乙個輸入或者輸出迭代器,同樣也可以用前向雙向迭代器物件接收

三、迭代器相關的輔助函式

下面四個函式在使用前,要新增標頭檔案 #include

1.advance

template void advance (inputiterator& it, distance n);
該函式可將迭代器it的位置增加,其中對於雙向和隨機訪問迭代器來說,n有可能是負數,此時迭代器的位置後退,n的型別一般來說是整形

注意:該函式並不檢查迭代器it是否超過了end(),所以有可能導致迭代器失效,所以使用前要判斷是否小於end()

示例

void advancetest()

2.next和prev

template forwarditerator next (forwarditerator it, typename iterator_traits::difference_type n = 1);

template bidirectionaliterator prev (bidirectionaliterator it, typename iterator_traits::difference_type n = 1);

next表示將迭代器的位置向前移動,如果it是乙個雙向迭代器或者是乙個隨機迭代器,那麼n可以為負值,表示向後移動

prev表示將迭代器的位置向後移動,n可以為負值,表示向前移動

這兩個函式依然不會保證迭代器有效,所以,呼叫者要自行保證這兩個函式執行後,迭代器有效

示例

void nextprevtest()

distance是計算並返回兩個迭代器之間的距離,這兩個迭代器必須指向同乙個容器物件,如果first和last不是隨機訪問迭代器,那麼,first前進必須能到達last,first必須在last之前或指向同一位置

示例

void distancetest()

如果將第六行的**改為int num=distance(it2,it1);,則會產生段錯誤

參考《c++ primer》

《c++標準庫》

C 知識點複習 C 標準庫

過載左移操作符 操作符 的原生意義是按位左移,例如 1 2 其意義是將整數1按位左移2位,即 0000 0001 0000 0100 過載左移操作符,將變數或常量左移到乙個物件中 示例 include char endl n class console console operator char c...

C 標準庫順序容器知識點總結

c 具有內建資料結構,但為了更好的滿足開發者的需求,c 標準庫提供了多種容器來供程式設計師呼叫,本篇部落格主要是順序容器的相關知識點總結 在c 中,容器主要是一些特定型別的集合,順序容器為程式設計師提供儲存和順序訪問的能力,主要的容器型別有vector deque list forward list...

c 知識點 標準string類

概念 1 c 將字串視為基本資料型別,是c字串的替代物 2 理解 引號字串如 hello world 本質是c字串,c 會自動將其轉型為string型別的值 string s hello world 可將引號字串視為string型別的值 2 使用 include呼叫,位於std命名空間 3 通過操作...