什么是迭代器
迭代器有时又称为游标,是一种设计模式,可以通过迭代器去访问容器对外提供的接口(begin,end),从而访问容器内部的数据,从而保护了容器的封装性,也就对外屏蔽了容器的结构。
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。以对象的方式存在,作指针使用。
迭代器的作用
- 避免了暴露容器的可能
- 针对不同的数据结构提供了统一的访问方式
迭代器的基本操作
迭代器的基本操作:++、!=、*、==、=等。
使用迭代器,则必须有容器对外提供应有的接口,比如begin(指向容器内部第一个元素的位置),end(指向容器内部最后一个元素的下一位置)
最重要的四个操作:
-
通过容器的接口begin()指向容器第一个元素位置
-
通过*解引用的方式获取当前位置的数据
-
通过++操作向后遍历
-
通过接口end()可以限制遍历的位置
class String; class Iterator { public: Iterator(String* ps,int idx):pstr(ps),index(idx) {} bool operator!=(const Iterator rhs) { return index!=rhs.index; } const Iterator operator++(int) { const Iterator tmp(*this); index++; return tmp; } Iterator& operator++() { index++; return *this; } char& operator*(); private: String* pstr; int index; }; class String { public: typedef Iterator iterator; String(char* ptr) { mptr=new char[strlen(ptr)+1](); strcpy_s(mptr,strlen(ptr)+1,ptr); } ~String() { delete mptr; mptr=NULL; } String(const String& rhs) { mptr=new char[strlen(rhs.mptr)+1]; strcpy_s(mptr,strlen(rhs.mptr),rhs.mptr); index=rhs.index; } String& operator=(const String& rhs) { if(this!=&rhs) { delete[] mptr; mptr=new char[strlen(rhs.mptr)+1](); strcpy_s(mptr,strlen(rhs.mptr)+1,rhs.mptr); } return *this; } iterator begin() { return iterator(this,0); } iterator end() { return iterator(this,strlen(mptr)); } char& operator[](int index) { return mptr[index]; } private: char* mptr; int index; }; char& Iterator::operator*() { return (*pstr)[index]; } int main() { String str("hello"); String::iterator it=str.begin(); for(it;it!=str.end();++it) { cout<<*it<<" "; } cout<<endl; }