定義
迭代器(Iterator)是STL(Standard Template Library,標準模板庫)中的一個核心概念,用于提供一種通用的方式來遍歷容器(如vector、list、map等)中的元素,而無需暴露容器的底層細節。迭代器本質上是一個指針,但它可以指向容器中的元素,而不僅僅是指向內存地址。
迭代器提供了以下基本操作:
begin()
: 返回一個指向容器中第一個元素的迭代器。end()
: 返回一個指向容器中最后一個元素之后的位置的迭代器。*
: 解引用運算符,返回迭代器當前指向的元素的值。++
: 前綴和后綴自增運算符,將迭代器向前移動到下一個元素。--
: 前綴和后綴自減運算符,將迭代器向后移動到前一個元素。+=
?和?-=
: 用于將迭代器向前或向后移動指定數量的元素。operator==
?和?operator!=
: 用于比較兩個迭代器是否相等或不相等。
示例
遍歷vector
#include <iostream>
#include <vector> int main() { std::vector<int> v = {1, 2, 3, 4, 5}; // 使用迭代器遍歷vector for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; } return 0;
}
STL?迭代器的實現
在STL(Standard Template Library)中,迭代器的實現是高度抽象化的,并且作為模板類存在于各個容器中。由于STL的實現是庫的一部分,并且通常作為編譯器的標準庫提供,所以直接查看STL迭代器的源碼可能不是很容易,因為源碼通常不包含在標準庫中,而是作為庫的實現部分,與編譯器一起提供。
簡單迭代器實現示例
#include <iostream> // 迭代器類模板
template<typename T>
class Iterator {
public: // 構造函數 Iterator(T* ptr) : ptr_(ptr) {} // 解引用運算符 T& operator*() const { return *ptr_; } // 前綴自增運算符 Iterator& operator++() { ++ptr_; return *this; } // 后綴自增運算符 Iterator operator++(int) { Iterator temp = *this; ++ptr_; return temp; } // 不相等運算符 bool operator!=(const Iterator& other) const { return ptr_ != other.ptr_; } private: T* ptr_; // 指向元素的指針
}; // 容器類模板
template<typename T, std::size_t N>
class Array {
public: // 類型別名,方便使用 using iterator = Iterator<T>; // 獲取迭代器指向容器的開始 iterator begin() { return iterator(data_); } // 獲取迭代器指向容器的結束(尾后迭代器) iterator end() { return iterator(data_ + N); } // 數組數據 T data_[N];
}; int main() { // 創建一個包含整數的數組容器 Array<int, 5> arr = {1, 2, 3, 4, 5}; // 使用迭代器遍歷數組 for (auto it = arr.begin(); it != arr.end(); ++it) { std::cout << *it << " "; } return 0;
}
在這個示例中,我們定義了一個Iterator
類模板,它接受一個類型參數T
,代表迭代器將指向的元素類型。迭代器包含了一個指向元素的指針,并重載了*
、++
和!=
運算符,這些都是STL迭代器通常提供的操作。
我們還定義了一個Array
類模板,它包含了一個固定大小的數組和一個使用我們定義的迭代器類型的begin
和end
成員函數。這個Array
類模板提供了一個簡單的容器接口,可以通過迭代器來訪問其元素。
請注意,這個示例只是為了展示迭代器的基本概念和操作,并不能代表STL中迭代器的完整和高效實現。在實際的STL庫中,迭代器的實現會更加復雜,并且會考慮到性能優化、類型安全和異常安全等因素。