迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容(不用关心对象内部)。
迭代器的区间:【) 左闭右开
迭代器也可以理解为是一个面向对象的指针;
面向对象的指针:以对象的形式存在,做指针的事;
迭代器和指针的区别:
容器和string有迭代器类型同时拥有返回迭代器的成员。如:容器有成员begin和end,其中begin成员复制返回指向第一个元素的迭代器,而end成员返回指向容器尾元素的下一个位置的迭代器,也就是说end指示的是一个不存在的元素,所以end返回的是尾后迭代器。
迭代器模式的作用:Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个
类中进行,这样就避免了暴露这个聚合对象的内部表示的可能;
Iterator 模式典型的结构图为:
由图可以知道:Iterator模式的核心就是下边四个方法
First();
Next();
isDone();
CurrentItem();
以下代码分别以
begin()
end()
*it
++ 实现
代码实现:
#include<string>//C++ C字符串封装
#include<iostream>
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(const String& rhs)
{
mptr = new char[strlen(rhs.mptr) + 1]();
strcpy_s(mptr, strlen(rhs.mptr) + 1, rhs.mptr);
}
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;
}
~String()
{
delete[] mptr;
mptr = NULL;
}
iterator begin()
{
return iterator(this, 0);
}
//迭代器区间 [)
iterator end()
{
return iterator(this, strlen(mptr));//"hello" 5
}
char& operator[](int index)
{
return mptr[index];
}
private:
char* mptr;
};
//String str("hello"); str[0]// str[1] str[2]
char& Iterator::operator*()
{
return (*pstr)[index];
}
#include<vector>//数组
#include<list>
#include<set>//红黑树
int main()
{
int arr[] = {
53, 46, 546, 8, 70, 4 };
int len = sizeof(arr) / sizeof(arr[0]);
std::vector<int> vector(arr, arr+len);//char*
std::vector<int>::iterator it = vec.begin();//it 迭代器 面向对象的指针
while (it != vec.end())
{
std::cout << *it << " ";//operator*
it++;
}
std::cout << std::endl;
return 0;
}
运行结果: