C 迭代器記錄

2021-10-07 04:36:00 字數 3612 閱讀 8944

(1)為什麼要引入迭代器:

我們知道在使用指標的時候指標可以用來遍歷儲存空間連續的資料結構;但是我們還有一些儲存空間是不連續的,就需要尋找乙個行為類似指標的類,來對非陣列的資料結構進行遍歷。

(2)什麼是迭代器:

迭代器:就是不停的在執行一些操作(類似於迴圈吧)。可以用它來訪問可迭代序列;通常其從序列的第乙個元素開始訪問,直到所有的元素都被訪問才結束。因此,迭代器是一種檢查容器內元素並遍歷元素的資料型別。

迭代器提供對乙個容器中的物件的訪問方法,並且定義了容器中物件的範圍。 

(3)使用迭代器帶來的便利性:

使用迭代器的好處是:使用迭代器不要求事先準備好整個迭代過程中的所有元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後元素可以不存在或者被銷毀。因此迭代器適合遍歷一些數量巨大甚至無限的序列。

(4)定義與使用:

格式:(容器有成員begin和end,其中begin成員複製返回指向第乙個元素的迭代器,而end成員返回指向容器尾元素的下乙個位置的迭代器,也就是說end指示的是乙個不存在的元素,所以end返回的是尾部之後的迭代器。)

容器::iterator iter;

for(iter= 容器.begin();iter!=容器.end();iter++)

如vector:vector< int>:: iterator iter;//定義乙個名為iter的變數,資料型別是由vector< int>定義的iterator 型別。簡單說就是容器類定義了自己的iterator型別,用於訪問容器內的元素。每個容器定義了一種名為iterator的型別,這種型別支援迭代器的各種行為。 

ps:每種容器型別都定義了自己的迭代器型別。

迭代器iterator 提供了一種一般化的方法對順序或關聯容器型別中的每個元素進行連續訪問

例如,假設iter為任意容器型別的乙個iterator,則++iter 表示向前移動迭代器使其指向容器的下乙個元素,而*iter 返回iterator 指向元素的值,每種容器型別都提供乙個begin()和乙個end()成員函式。其中begin()返回乙個iterator 它指向容器的第乙個元素;end()返回乙個iterator 它指向容器的末元素的下乙個位置(就是上邊說的尾部元素之後的未知);通過迭代器,我們可以用相同的方式來訪問、遍歷容器。

下面列舉了些例子說明各個容器的用法:

1.vector()

#include #include int main()

int size = charvector.size();

for (x = 0; x::iterator start = charvector.begin();

charvector.erase(start);從c容器中刪除迭代器p指定的元素,p必須指向c中的乙個真實元素,不能等於c.end()此處依次進入for迴圈的時候刪除start對應的第乙個元素

std::vector::iterator iter;

for (iter = charvector.begin(); iter != charvector.end(); iter++)

std::cout << std::endl;

} return 0;

}

結果輸出:

此處插入乙個如何刪除容器中元素的函式,包括順序容器和關聯容器。就是上述中的erase()函式。

c.erase(p)//從c中刪除迭代器p指定的元素,p必須指向c中的乙個真實元素,不能等於c.end(),因為c.end()元素不存在。

c.erase(b,e)//從c中刪除迭代器對b和e所表示的範圍中的元素。

實際上,erase函式本來是用來操作string的,函式原型如下:

(第一種用法)string& erase ( size_t pos = 0, size_t n = npos );刪除從pos開始的n個字元,比如erase(0,1)就是刪除第乙個字元

(第二種用法)iterator erase ( iterator position );刪除position處的乙個字元(position是個string型別的迭代器)

(第三種用法)iterator erase ( iterator first, iterator last );刪除從first到last之間的字元(first和last都是迭代器)

// 第二種用法

vectore = ;

auto it = e.end()-1; //.end()指向末尾的下乙個元素,因此需要-1,指向末尾元素

e.erase(it); //刪除末尾元素「g」

// 第三種用法

auto it2 = e.begin()+1;

auto it3 = e.end()-2;

e.erase(it2,it3); //刪除it2到it3之間的元素

//第三種用法的擴充套件

auto it = e.begin();

auto it2 = find(e.begin(), e.find(), "c"); //it2指向「c」所在位置

auto it3 = e.erase(it,it2); //刪除it到it2之間的所有元素,即「a」和「b」;因為it2所指向的是c的位置,但是erase()函式不包括it2。

e.erase(it3); //此時刪除的是「c」,即先前it2所指,因為第三種用法返回的就是第二個迭代器所指位置(理解是因為it3刪除了a,b所以目前指向的是c的位置。)

//第一種用法

string str ("this is an example phrase.");

str.find("an");

str.erase(10); // 也可以使用下標進行刪除操作,刪除下標10開始及以後的字元

str.erase (10,8); // 此處意為刪除下標『10』開始的連續8個字元//第乙個引數表示的是下標值「10」!不是第10個!

2.deque(佇列的操作特性是先進先出(fifo即first-in-first-out)意思就是先進去的先出來,例如:一排人走過道,從這頭走到另一頭,肯定是走在最前面的人先出去嘛)

佇列的順序實現是指分配一塊連續的儲存單元存放佇列中的元素,並設兩個指標:隊頭指標front和隊尾指標rear。

#include #include int main()

int size = chardeque.size();

for (x = 0; x::iterator start =chardeque.begin();

chardeque.erase(start);//刪除

std::deque::iterator iter;

for (iter = chardeque.begin();iter != chardeque.end(); iter++)

std::cout << std::endl;

} return 0;

}

結果輸出:

參考:

C 迭代器之 反向迭代器

反向迭代器 reverse iterator 是普通迭代器的介面卡,通過重新定義自增和自減操作,以達到按反序遍歷元素的目的。如果在標準演算法庫中用反向迭代器來代替普通的迭代器,那麼執行結果與正常情況下相反。除此之外,其用法與普通迭代器完全一樣,我們不作詳細討論。這裡主要討論的是反向迭代器的乙個很特殊...

C 迭代器 迭代器失效問題

問題描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。這是劍指offer上的一道經典習題,我們首先可以想到的解決方案是 再建立乙個臨時陣列把偶數先存放起來,然後把臨時空間的...

C 迭代器(STL迭代器)iterator詳解

要訪問順序容器和關聯容器中的元素,需要通過 迭代器 iterator 進行,迭代器是乙個變數,相當於容器和操作容器的演算法之間的中介。迭代器可以指向容器中的某個元素,通過迭代器就可以讀寫它指向的元素。從這一點上看,迭代器和指標型別。迭代器按照定義方式分為以下四種 正向迭代器,定義方式 容器類名 it...