#pragma once
#ifndef ITERATOR_H
#define ITERATOR_H
#include <vector>
#include <iostream>
using namespace std;
class Iterater;
// 容器的抽象基類
template <class DATA> class Aggregate
{
public:
virtual ~Aggregate(){}
virtual int GetSize() = 0;
virtual DATA GetItem(int nIndex) = 0;
};
// 疊代器的抽象基類
class Iterater
{
public:
virtual ~Iterater(){}
virtual Iterater& operator++() = 0;
virtual Iterater& operator++(int) = 0;
private:
};
// 一個具體的容器類,這裡是用數組表示
template <class DATA> class ConcreateIterater;
template <class DATA=int, typename MAX_SIZE=1024> class ConcreateAggregate : public Aggregate<DATA>
{
public:
ConcreateAggregate();
virtual ~ConcreateAggregate();
virtual ConcreateIterater<DATA>& begin();
virtual ConcreateIterater<DATA>& end();
virtual void push_back(DATA dt);
virtual DATA pop_back();
virtual int GetSize();
virtual DATA GetItem(int nIndex);
DATA operator[](size_t nIndex)
{
if (nIndex >= m_aData.size())
{
cout<<"index out of range"<<endl;
return -1;
}
return m_aData[nIndex];
}
private:
ConcreateIterater<DATA> *m_begin;
ConcreateIterater<DATA> *m_end;
vector<DATA> m_aData;
};
// 通路ConcreateAggregate 容器類的疊代器類
template <class DATA> class ConcreateIterater : public Iterater
{
public:
ConcreateIterater(Aggregate<DATA>* pAggregate)
: m_pConcreateAggregate(pAggregate)
, m_nIndex(0)
{
}
virtual ~ConcreateIterater(){}
ConcreateIterater& operator*()
{
return *this;
}
friend ostream &operator<<(ostream &os,const ConcreateIterater &itr)
{
os << itr.m_pConcreateAggregate->GetItem(itr.m_nIndex);
return os;
}
friend istream &operator>>(istream &is,ConcreateIterater &itr)
{
int tmp = itr.m_pConcreateAggregate->GetItem(itr.m_nIndex);
is >> tmp;
return is;
}
virtual Iterater& operator++()//for ++itr
{
m_nIndex++;
return *this;
}
virtual Iterater& operator++(int) //for itr++
{
ConcreateIterater *tmp = this;
m_nIndex++;
return *tmp;
}
bool operator==(ConcreateIterater itr)
{
return this->m_nIndex == itr.m_nIndex;
}
bool operator!=(ConcreateIterater itr)
{
return this->m_nIndex != itr.m_nIndex;
}
template <class DATA, int MAX_SIZE> friend class ConcreateAggregate;
private:
Aggregate<DATA> *m_pConcreateAggregate;
int m_nIndex;
};
#endif
#include "StdAfx.h"
#include "iterator_impl.h"
#include <iostream>
template <class DATA, int MAX_SIZE>
ConcreateAggregate<DATA, MAX_SIZE>::ConcreateAggregate()
:m_begin(NULL)
,m_end(NULL)
{
}
template <class DATA, int MAX_SIZE>
ConcreateAggregate<DATA, MAX_SIZE>::~ConcreateAggregate()
{
}
template <class DATA, int MAX_SIZE>
ConcreateIterater<DATA>& ConcreateAggregate<DATA, MAX_SIZE>::begin()
{
if (m_begin == NULL)
{
m_begin = new ConcreateIterater<DATA>(this);
m_begin->m_nIndex = 0;
}
return *m_begin;
}
template <class DATA, int MAX_SIZE>
ConcreateIterater<DATA>& ConcreateAggregate<DATA, MAX_SIZE>::end()
{
if (m_end == NULL)
{
m_end = new ConcreateIterater<DATA>(this);
m_end->m_nIndex = m_aData.size();
}
return *m_end;
}
template <class DATA, int MAX_SIZE>
void ConcreateAggregate<DATA, MAX_SIZE>::push_back(DATA dt)
{
m_aData.push_back(dt);
}
template <class DATA, int MAX_SIZE>
DATA ConcreateAggregate<DATA, MAX_SIZE>::pop_back()
{
DATA tmp = m_aData.back();
m_aData.pop_back();
return tmp;
}
template <class DATA, int MAX_SIZE>
int ConcreateAggregate<DATA, MAX_SIZE>::GetSize()
{
return m_aData.size();
}
template <class DATA, int MAX_SIZE>
DATA ConcreateAggregate<DATA, MAX_SIZE>::GetItem(int nIndex)
{
if (nIndex < m_aData.size())
{
return m_aData[nIndex];
}
return -1;
}
// Iterator.cpp : 定義控制台應用程式的入口點。
//
#include "stdafx.h"
#include "iterator_impl.h"
#include "iterator_impl.cpp"
#include <stdlib.h>
#include <memory>
#include <iostream>
using namespace std;
//提供一種方法順序通路一個聚合對象中各個元素,,而又不需暴露該對象的内部表示.
typedef ConcreateAggregate<> dmVector;
typedef ConcreateAggregate<int,64> mVector;
typedef ConcreateIterater<int> mIterator;
int _tmain(int argc, _TCHAR* argv[])
{
mVector vtdata;
vtdata.push_back(1);
vtdata.push_back(2);
vtdata.push_back(3);
vtdata.push_back(4);
for (mIterator itr = vtdata.begin();itr != vtdata.end(); itr++)
{
std::cout << *itr <<" ";
}
cout<<endl;
for (int i=0;i<vtdata.GetSize();++i)
{
std::cout<<vtdata[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}