迭代器的使用

2021-07-31 03:17:02 字數 1715 閱讀 3918

迭代器(iterator)有時又稱游標(cursor),是程式設計的軟體設計模式,他是專門為訪問容器而設計的一種資料結構,他實際是對訪問容器這一操作進行了封裝。也有一種說法是迭代器是指標的封裝。和智慧型指標有點相似。

迭代器是一種物件,他用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的位址,迭代器修改了常規指標的介面,他可以把抽象容器和通用演算法有機的統一起來。

迭代器提供一些基本操作符:*,++,–,!= == 等,這些操作和c/c++操作array元素時的指標介面一致。不同之處在於,迭代器是個所謂的複雜的指標,具有遍歷複雜資料結構的能力。其下層執行機制取決於其遍歷的資料結構,因此, 每一種容器型別都必須提供自己的迭代器。事實上每一種容器都將其迭代器以巢狀的方式定義於內部。因此各種迭代器的介面相同,型號卻不同。

下面我們通過幾段**來讓大家熟悉迭代器的使用。

第一段**我們在順序容器型別的動態陣列vector的基礎上來學習使用迭代器。

void print(vector

& v)

cout

<< endl;

}void vectortest()

int main()

在上述**中,函式print()裡面就是迭代器的使用,具體我們來看看,你可以對比指標來看迭代器。

函式引數,因為迭代器在這也就是起到遍歷訪問動態陣列的作用,你在傳參時最好使用引用傳值,不要使用傳值呼叫,因為傳值呼叫會使得呼叫拷貝建構函式,但是這裡根本不需要深拷貝的運用,所以不合適使用,之前我們引用傳參時,前面總是加上const,這裡可以加嗎?明確告訴你,不行。為什麼呢?

迭代器分三種:

普通迭代器(iterator)

const迭代器(const_iterator)

反向迭代器(reverse_iterator)

void print(const

vector

& v)

cout

<< endl;

}

解決了const轉換問題,但是依然不能編譯通過,「*it = 10」這一句**出現問題,因為你企圖給const常量賦值。所以在這裡傳參時就不加const了。

第二段**我們在順序容器型別的雙向鍊錶list的基礎上進行學習。

void print(list

& l)

cout

<< endl;

}void listtest()

int main()

在這基礎上,我們來學習使用反向迭代器的使用。

void print(list

& l)

cout

<< endl;

}

下面我們在自定義型別的基礎上來學習使用迭代器

struct aa

;void listtest()

cout

<< endl;

}

從上述關於迭代器的使用學習,你可能會發現他和指標的功能特別相似,他實際上指標是狹義的迭代器,迭代器是指標的抽象。迭代器是具有類似指標行為的class template。也就是過載了operator->、 operator*、 operator++等操作符的類模板。下篇文章會簡單模擬實現迭代器。

迭代器的使用

先看下面的例子 vector 的元素刪除 話頭從 container 的元素刪除說起。jyhuang 觀察到 如果 vector 或 list 的最後乙個元素符合刪除條件,程式會有問題 他給我這樣乙個片段 template void print elements t elem void pfi in...

迭代器的使用

參考 stl中的迭代器有五種型別,不同的容器可支援不同的迭代器 1.vector,支援隨機迭代器 include include include using namespace std int main cout endl cout endl vector iterator iter1 charve...

使用迭代器

建立迭代器最常用的方法是對 ienumerable 介面實現 getenumerator 方法,例如 c 複製 public system.collections.ienumerator getenumerator getenumerator 方法的存在使得型別成為可列舉的型別,並允許使用 fore...