【C++】STL常用容器總結之一:容器與迭代器

聲明:

  • 1、本博文主要整理自《C++ Primer》和《STL源碼剖析》這兩本經典書籍。同時,也參考了網絡中不少優秀博客,對這些博客的作者表示感謝。
  • 2、由於博主能力有限,對於一些容器的用法可能尚未進行深入研究。因此,本博文若有錯誤和不足之處,歡迎大家批評指正。
  • 3、本博文僅作學術交流只用,無任何其他用途。

言歸正傳,下面開始介紹C++中的STL容器。

1、容器的概念

Standard Template Library,標準模板庫。
所謂STL容器,就是將最常用的一些數據結構實現出來。常用的數據結構不外乎數組array、鏈表list、樹tree、堆棧stack、隊列queue、散列表hash table、集合set、映射表map等,根據“數據在容器中的排列”特性,這些數據結構可分爲序列式和關聯式兩種。因此,容器大概也分爲序列式容器和關聯式容器兩種。
容器的分類

2、迭代器簡介

我們在使用容器的時候,迭代器是一個不可分割的部分。迭代器在STL中用來將算法和容器聯繫起來,起着一種膠着劑的作用。迭代器是一種檢查容器內元素並遍歷元素的數據類型。迭代器是一種行爲類似指針的對象,它提供類似指針的功能,對容器的內容進行走訪,而指針的各種行爲中最常見也最重要的便是“內容提領”和“成員訪問”。因此,迭代器最重要的編程工作就是對operator*和operator->進行重載工作。

1、容器的迭代器類型

幾乎STL提供的所有算法都是通過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器類型,用以存取容器中的元素,如vector:

vector<int>::iterator iter;  // 將iter聲明爲int類型的向量迭代器

這條語句定義了一個名爲iter的變量,它的數據類型是由vector定義的iterator類型。每個標準庫容器類型都定義了一個名爲iterator的成員,這裏的iterator與迭代器的實際類型相同。術語迭代器通常指的是概念上的迭代器,而術語迭代器類型則是有容器定義的具體的iterator的類型,如vector。
常見的迭代器類型主要有:迭代器類型iterator、元素的只讀迭代器類型const_iterator、按逆序尋址元素的迭代器reverse_iterator、元素的只讀逆序迭代器const_reverse_iterator。

2、迭代器的begin和end操作

vector<int>::iterator iter = vec.begin();

begin返回的迭代器指向容器內第一個元素,end返回的迭代器指向容器內“最後一個元素的下一個位置”,end操作返回的迭代器並不指向vector中任何實際的元素,它只是起到一個哨兵的作用,表示我們已經處理完vector中的所有元素。
rbegin返回一個逆序迭代器,它指向容器的最後一個元素,rend返回一個逆序的迭代器,它指向容器的第一個元素前面的位置。

3、迭代器的自增和解引用

迭代器類型可使用解引用操作符(*操作符)來訪問迭代器所指向的元素,解引用操作符返回迭代器當前所指向的元素。但是,不能對end操作返回的迭代器進行解引用。迭代器也可以使用自增操作符向前移動迭代器指向容器中下一個元素,這在形式上與int型對象的自增操作類似。
這裏寫圖片描述

關係操作符只適用於vector和deque容器,這是因爲只有這兩種容器爲其元素提供快速、隨機的訪問。它們確保可根據元素位置直接有效地訪問指定的容器元素。這兩種容器都支持通過元素的位置實現隨機訪問,因此它們的迭代器可以有效地實現算術和關係運算。
C++語言使用一對迭代器來標記迭代器的範圍。迭代器範圍:[first, last)是一個左閉合區間,表示範圍從first開始,到last結束,但不包括last,即last指向容器內最後一個元素的下一個元素。注意:如果first不等於last,則對first反覆做自增運算必須能夠到達last;否則,即last位於first之前,則將發生未定義行爲。迭代器範圍使用左閉合的意義:因爲這樣可以統一表示空集,就無需特別處理。當first和last相等時,迭代器的範圍是空。

4、各容器支持的迭代器類別

只有順序容器和關聯容器支持迭代器遍歷,各容器支持的迭代器的類別如下:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章