C++迭代器设计模式

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

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Gunanhuai/article/details/103425772
今日推荐