1,iterator的作用
通過iterator脱盲,可以對一個數(shù)據(jù)體的集合進程遍歷訪問香府,而遍歷的規(guī)則可以有iterator自身行為決定谷暮。比如對于連續(xù)集合或者列表集合夫椭,可以定義為前向遍歷或者后向遍歷,對于樹結構可以進行前序杉畜,中序或者后序遍歷等纪蜒。
2, C++ 中的iterator
C++ 中的iterator類型此叠,可以分為如下部分纯续,具體鏈接C++Reference:
3,vector的iterator
那么對于vector iterator灭袁,要實現(xiàn)什么呢猬错?
vector是一個連續(xù)存儲的數(shù)組,在沒有iterator的情況下茸歧,我們一般通過指針+索引來遍歷一個數(shù)組倦炒。因此對于一個vector iterator,要實現(xiàn)以下幾點基本功能:
(1)增加或者減少软瞎,可對比指針的++p或者--p
(2)隨機索引析校,可對比指針的p+n
(3)通用屬性,比如訪問數(shù)據(jù)铜涉,比較,開始結束等
有了上面3點目標遂唧,我們就可以開始著手寫代碼了芙代,其實就是實現(xiàn)一個Random Access的iterator。
template<typename T>
class MyVector
{
...
public:
class iterator
{
T* p_;
public:
iterator() : p_(nullptr){}
iterator(T*p ) : p_(p) {}
iterator(const iterator& it) : p_(it.p_) {}
iterator& operator=(const iterator& it) {p_ = it.p_; return *this;}
iterator operator++ () {++p_; return p_;}
iterator operator-- () {--p_; return p_;}
iterator operator++ (int) {T* p = p_; ++p_; return p;}
iterator operator-- (int) {T* p = p_; --p_; return p;}
bool operator ==(const iterator& it) {return it.p_ == p_;}
bool operator !=(const iterator& it) {return !(it.p_ == p_);}
T& operator *() {return *p_;}
T* operator ->() {return p_;}
};
iterator begin() {return iterator(array_);}
iterator end() {return iterator(array_ + length_);}
};
測試代碼如下:
MyVector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::cout << v.size() << v[0] << v[1] << v[2] << std::endl;
v.push_back(1);
std::cout << v.size() << std::endl;
for (MyVector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
std::cout << "it = " << *it << std::endl;
}
至此盖彭,一個基本的vector已經(jīng)完成纹烹。