我們已經知道可以使用下標運算子來訪問string物件的字元或者vector物件的元素,還有另外一種方法也可以實現同樣的目的,那就是迭代器。和指標類似,迭代器提供了對物件的間接訪問,其物件是容器中的元素。
auto b = v.
begin()
, e = v.
end(
);
begin成員負責返回指向第乙個元素的迭代器,end成員負責返回指向容器尾元素的下一位置的迭代器,也就是說,該迭代器指示的是容器中乙個不存在的尾後元素,稱作尾後迭代器。
如果容器為空,則begin和end返回的是同乙個迭代器,都是尾後迭代器。
一般來說,我們不用在意迭代器的準確型別是什麼,一般使用auto關鍵字由編譯器自動推導出型別。
迭代器運算子
運算子說明*iter
返回iter所指元素的引用
iter->mem
解引用iter並獲取該元素名為mem的成員,等價於(*iter).mem
++iter
令iter指向容器中的下乙個元素
–iter
令iter指向容器中的上乙個元素
iter1==iter2
判斷兩個迭代器是否相等,如果指向同乙個元素或者都是尾後迭代器則相等
iter1!=iter2
判斷兩個迭代器是否相等,如果指向同乙個元素或者都是尾後迭代器則相等
關鍵概念:泛型程式設計
原來使用c的程式設計師在使用c++後,會對for迴圈中使用!=而非《進行判斷感到奇怪。c++習慣使用!=,其原因和他們更願意使用迭代器而非下標的原因一樣:因為這種風格在標準庫提供的所有容器上都有效。所有的標準庫都定義了!=和==,但是它們中大多數都沒有定義《運算子。因此,只要我們養成使用迭代器!=的習慣,就不用太在意到底使用哪種型別的容器。
迭代器型別
擁有迭代器的標準庫型別使用iterator和const_iterator來表示迭代器的型別:
vector<
int>
::iterator it1;
//it1能讀寫vector的元素
string::iterator it2;
//it2能讀寫string物件中的字元
vector<
int>
::const_iterator it3;
//it3只能讀元素,不能寫元素
string::const_iterator it4;
//it4只能讀字元,不能寫字元
const_iterator和常量指標類似,能讀但是不能修改它所指的元素值,相反,iterator的物件可讀可寫。如果容器的物件是乙個常量,只能使用const_iterator,如果不是常量,則都可以使用。
begin和end運算子
begin和end返回的具體型別由物件是否是常量決定,如果是常量,返回const_iterator,如果不是返回iterator。
有時候這種行為並不是我們想要的,如果物件只需要讀操作不需要寫操作的話最好使用常量類。為了便於專門得到const_iterator型別,c++11新標準引入來兩個新函式,分別是cbegin和cend,不論vector物件本身是否是常量,返回值都是const_iterator。
auto iter1 = v.
cbegin()
, iter2 = v.
cend()
;
下面是迭代器支援的運算:
運算描述
iter + n
迭代器加上乙個整數仍得乙個迭代器,迭代器指示新位置與原來相比向前移動了n個元素
iter - n
迭代器減去乙個整數仍得乙個迭代器,迭代器指示新位置與原來相比向後移動了n個元素
iter += n
迭代器加法復合賦值語句,將iter1加n的結果賦給iter1
iter -= n
迭代器減法復合賦值語句,將iter1減n的結果賦給iter1
iter1 - iter2
兩個迭代器相減的結果是它們之間的距離 ,兩個迭代器必須指向同乙個容器中的元素,所得結果的型別是difference_type的帶符號的整數
<,<=,>,>=
迭代器關係運算子,參與運算的兩個迭代器必須指向同乙個容器中的元素或者尾元素的下一位置
C 字串 向量和陣列
vector物件 以及string物件 的下標運算子可用於訪問已存在的元素,而不能用於新增元素。只能對確知已存在的元素執行下標操作。所有標準庫容器都可以使用迭代器,string物件不屬於容器型別,但是支援很多與容器型別類似的操作。const vectorcv auto it cv.begin it ...
字串 向量和陣列
迭代器介紹 陣列定義和初始化string物件 string物件上的操作 處理string物件中的字元 定義和初始化 vector v1 vector v2 v1 v2中包含有v1中所有元素的副本 vector v2 v1 等價於v2 v1 vector v3 n,va1 v3包含n個重複的v1 ve...
C 字串 向量和陣列筆記
標頭檔案中一般來說不應包含using宣告 string size 返回無符號整數,型別是size type s.size n為負值int型,會把n自動轉換成無符號型別,n n mod 256 c風格的字串 c風格的字串存放在字元陣列中並以空字元結束 null terminated,0 char ca...