STL容器簡介以及迭代器介紹

2021-10-01 13:06:13 字數 3830 閱讀 2467

容器(container)是用於存放資料的類模板。在使用容器時,即將容器類模板例項化為容器類時,會指明容器中存放的元素是什麼型別的。在容器中,可以存放基本型別的變數,也可以存放物件, 而物件或基本型別的變數被插入容器中時,實際插入的是物件或變數的乙個複製品。

容器分為兩大類,順序容器和關聯容器。

順序容器有以下三種:可變長動態陣列 vector雙端佇列 deque雙向鍊錶 list。之所以被稱為順序容器,是因為元素在容器中的位置同元素的值無關,即容器不是排序的。將元素插入容器時,指定在什麼位置插入,元素就會位於什麼位置。

關聯容器有以下四種:set、multiset、map、multimap。關聯容器內的元素是排序的。插入元素時,容器會按一定的排序規則將元素放到適當的位置上,因此插入元素時不能指定位置。預設情況下,關聯容器中的元素是從小到大排序(或按關鍵字從小到大排序)的,而且用《運算子比較元素或關鍵字大小。因為是排好序的,所以關聯容器在查詢時具有非常好的效能。

除了了以上兩類容器外,stl 還在兩類容器的基礎上遮蔽一部分功能,突出或增加另一部分功能,實現了三種容器介面卡:棧 stack佇列 queue優先順序佇列 priority_queue

容器都是類模板,例項化後就成為容器類,用容器類定義的物件稱為容器物件。例如,vector是乙個容器類的名字,vectora就定義了乙個容器物件 a,a 代表乙個長度可變的陣列,陣列中的每個元素都是 int 型別的變數。

任何兩個容器物件,只要它們的型別相同,就可以用 <、<=、>、>=、==、!= 進行詞典式的比較運算。假設 a、b 是兩個型別相同的容器物件,這些運算子的運算規則如下。

a == b:若 a 和 b 中的元素個數相同,且對應元素均相等,則a == b的值為 true,

否則值為 false

a則a其他情況下值為 false。元素比較大小是通過《運算子進行的。

a != b:等價於 !

(a == b)。

a > b:等價於 b < a。

a <= b:等價於 !

(b < a)。

a >= b:等價於 !

(a < b)。

所有容器都有的成員函式:

int size():返回容器物件中元素的個數。

bool empty():判斷容器物件是否為空。

順序容器和關聯容器還有以下成員函式:

begin():返回指向容器中第乙個元素的迭代器

end():返回指向容器中最後乙個元素後面的位置的迭代器

rbegin():返回指向容器中最後乙個元素的反向迭代器。

rend():返回指向容器中第乙個元素前面的位置的反向迭代器

erase(…):從容器中刪除乙個或幾個元素。該函式引數較複雜,此處省略

clear():從容器中刪除所有元素

如果乙個容器是空的,則 begin() 和 end() 的返回值相等,rbegin() 和 rend() 的返回值也相等

順序容器還有以下常用成員函式

front():返回容器中第乙個元素的引用

back():返回容器中最後乙個元素的引用

push_back():在容器末尾增加新元素

pop_back():刪除容器末尾的元素

insert(…):插入乙個或多個元素。該函式引數較複雜,此處省略

迭代器是乙個變數,相當於容器和操縱容器的演算法之間的中介,迭代器可以指向容器中的某個元素,通過迭代器就可以讀寫它指向的元素。

2.1 迭代器按照定義方式分成以下四種

1)正向迭代器,定義方法如下

容器類名::iterator  迭代器名;
2)常量正向迭代器,定義方法如下

容器類名::const_iterator  迭代器名;
3)反向迭代器,定義方法如下

容器類名::reverse_iterator  迭代器名;
常量反向迭代器,定義方法如下

容器類名::const_reverse_iterator  迭代器名;
通過迭代器可以讀取它指向的元素,*迭代器名就可以訪問迭代器指向的元素,通過非常量迭代器還能修改其指向的元素內容。

迭代器都可以進行++操作。反向迭代器和正向迭代器的區別在於:對正向迭代器進行++操作時,迭代器會指向容器中的後乙個元素,而對反向迭代器進行++操作時,迭代器會指向容器中的前乙個元素。

2.2 迭代器按功能強弱分為輸入、輸出、正向、雙向、隨機訪問五種

不同容器的迭代器,其功能強弱有所不同,而容器的迭代器的功能強弱,決定了該容器是否支援 stl 中的某種演算法。例如,排序演算法需要通過隨機訪問迭代器來訪問容器中的元素,因此有的容器就不支援排序演算法。

1)輸入迭代器:將容器中的資訊讀取到程式中的迭代器,利用*迭代器名可以讀取容器的資訊,但不一定能讓程式修改值,因此需要輸入迭代器的演算法將不會修改容器的值。

輸入迭代器多次遍歷容器可能會按不同順序,並且輸入迭代器遞增之後,也不能保證輸入其先前的值仍然可以解除引用。

支援++運算子(字首和字尾格式),並且輸入迭代器是單向迭代器,可以遞增但不能倒退。

2)輸出迭代器:將資訊從程式傳遞到容器的迭代器,利用*迭代器名可以修改容器的資訊,但是不能讀取。支援++運算子(字首和字尾格式),並且是單向迭代器,可以遞增但不能倒退。

因此,對於單通行、唯讀演算法可以使用輸入迭代器,對於單通行,只寫演算法,可以使用輸出迭代器。

3)正向迭代器:只使用++運算子來遍歷容器的迭代器,利用*迭代器名可以讀取容器的資訊,而非常量的正向迭代器還可以修改容器的資訊,並且多次遍歷容器的順序是相同。正向迭代器擁有輸入迭代器和輸出迭代器的所有特性

4)雙向迭代器:既能使用++運算子又能使用–運算子的迭代器,雙向迭代器擁有正向迭代器的所有特性。

4)隨機迭代器:擁有雙向迭代器的所有特性並且新增了支援隨機訪問的操作,若 p 是乙個隨機訪問迭代器,i 是乙個整型變數或常量, 支援以下操作

p+=i:使得 p 往後移動 i 個元素。

p-=i:使得 p 往前移動 i 個元素。

p+i:返回 p 後面第 i 個元素的迭代器。

p-i:返回 p 前面第 i 個元素的迭代器。

p[i]:返回 p 後面第 i 個元素的引用。

不同容器的迭代器的功能容器

迭代器功能

vector

隨機訪問迭代器

deque

隨機訪問迭代器

list

雙向迭代器

set / multiset

雙向迭代器

map / multimap

雙向迭代器

stack

不支援迭代器

priority_queue

不支援迭代器

queue

不支援迭代器

STL迭代器簡介

stl迭代器簡介 標準模板庫 the standard template library,stl 定義了五種迭代器。下面的圖表畫出了這幾種 input output forward bidirectional random access 要注意,上面這圖表並不是表明它們之間的繼承關係 而只是描述了迭...

STL迭代器簡介

stl將容器 containers 和演算法 algorithms 分隔開,兩者之間的紐帶就在於迭代器 iterators 迭代器也是一種智慧型指標,過載了例如常見的operator 以及operator 迭代器有常見的五種相應型別 iterator category value type diff...

STL 容器與迭代器

迭代器 迭代器是泛化的指標 但並不是指標 用法和指標類似,利用迭代器對容器中的元素序列的操作。格式舉例list itrerator it 迭代器本身是乙個物件,這個物件可以遍歷stl容器內部全部的物件,它能夠反覆地對stl容器內容進行訪問。迭代器所提供的基本操作如下所示 a.獲取當前被指向的元素,用...