迭代器(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...