程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> vector之迭代器iterator使用基礎教程

vector之迭代器iterator使用基礎教程

編輯:關於C語言
 

1、除了用下標訪問容器(包括vector)的元素外,標准庫還提供了一種方法:使用迭代器(iterator)。

2、迭代器是一種 檢查容器內元素並遍歷元素的 數據類型。(概念上來理解)

3、標准庫為每一種 標准容器(包括vector) 都定義了一種 迭代器類型。
因為迭代器對所有的容器都適用,只有少數容器支持下標操作,所以現在傾向於使用 迭代器 而不是 下標操作 來訪問元素,即使對支持下標操作的vector也是一樣。

4、迭代器和迭代器類型
容器的iterator類型:每一種容器都定義了自己的 迭代器類型,每個標准庫容器都定義了一個名為iterator的成員,這裡iterator與迭代器實際類型 (如vector::iterator)的含義相同。

vector::iterator iter;
定義了一個變量iter,數據類型是 由vector 定義的 iterator類型

注意:iterator表示的含義
1)一般意義上指的是迭代器的概念
2)具體而言時,指的是 由容器定義的具體的 iterator類型,如vector。

重點理解:
1)有很多用做迭代器的類型,這些類型在概念上是相關的。
2)若一種類型支持 一組確定的操作,這些操作可用來 遍歷容器內的元素,並訪問這些元素的值, 我們就稱這種類型為 迭代器。

綜合之:各 容器 都定義了自己的 iterator類型 ,用於訪問容器內的元素。
也就是每個 容器 都定義了一個名為 iterator 的類型,而這種類型支持 迭代器(概念上的)的各種操作。

5、容器的begin、end操作和 迭代器的操作
vector ivec ;
每種容器都定義了兩個函數,begin() end(),用於返回迭代器

vector::iterator iter = ivec.begin()
如果容器ivec內有元素,則begin返回的迭代器指向第一個元素ivec[0]。

由end返回的迭代器 指向容器的 “末端元素的下一個”。
通常稱為 超出末端迭代器(off-the-end iterator),表明它指向一個不存在的元素,它只起到一個哨兵的作用,表明已經處理完容器中所有的元素。
如果容器為空,則begin和end返回的迭代器相同。

迭代器類型的自增和解引用運算
自增:++
解引用:* (其實和C語言中的指針運算差不多)
end()返回的迭代器不指向任何元素,因此不能對其進行自增和解引用操作。
比較操作: == != (兩個迭代器對象指向同一個元素,則他們相等,否則不等)

vector迭代器還支持其他算術操作(其他標准庫容器迭代器很少)
iter + n
iter - n
n為整型值,對迭代器對象加上或者減去一個整型值,將產生一個新的迭代器,位置是iter所指元素之前(加)或者之後(減)n個元素的位置。新的迭代器必須指向vector中某個元素,或者是vector末端的後一個元素。

iter1 - iter2 (iter1,iter2必須指向同一vector中元素,或者vector末端之後的下一個元素)
用來計算兩個迭代器的距離,該距離是名為different_type的signed類型值,different_type類型和size_type類型相似,也是有vector定義的。

定位vector中間的元素

vector::iterator mid = vi.begin() + vi.size() / 2; 指向vi中最靠近中間的那一個

vector::iterator mid = (vi.begin() + vi.end()) / 2; //會產生什麼結果?
vi.begin 和 vi.end() 返回的都是vector迭代器類型,不能進行除法操作。

注意:任何改變vector長度的操作都會使已存在的迭代器失效。
例如,在調用push_back()之後,就不能信賴指向vector的迭代器的值了。

6、const_iterator 和 const iterator對象
每一種容器還定義了一種名為const_iterator的類型,該類型只能用於讀取元素,而不能改變元素。
使用const_iterator類型時,我們得到的迭代器所指向的對象不可變,但這個迭代器本身是可以改變。
const_iterator對象可以用於 const vector,也可以是非 const vector,因為它不能改寫元素的值。

聲明const迭代器時,必須進行初始化,一旦初始化,就不能改變它的值。(可以看出,const迭代器幾乎沒什麼用,它指向的元素可變,但是不能使他指向任何其他元素)。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved