#pragma once
#ifndef ITERATOR_H
#define ITERATOR_H
#include
#include
using namespace std;
class Iterater;
// 容器的抽象基类
template 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 ConcreateIterater;
template class ConcreateAggregate : public Aggregate
{
public:
ConcreateAggregate();
virtual ~ConcreateAggregate();
virtual ConcreateIterater& begin();
virtual ConcreateIterater& 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())
{
coutm_nIndex == itr.m_nIndex;
}
bool operator!=(ConcreateIterater itr)
{
return this->m_nIndex != itr.m_nIndex;
}
template friend class ConcreateAggregate;
private:
Aggregate *m_pConcreateAggregate;
int m_nIndex;
};
#endif
#include "StdAfx.h"
#include "iterator_impl.h"
#include
template
ConcreateAggregate::ConcreateAggregate()
:m_begin(NULL)
,m_end(NULL)
{
}
template
ConcreateAggregate::~ConcreateAggregate()
{
}
template
ConcreateIterater& ConcreateAggregate::begin()
{
if (m_begin == NULL)
{
m_begin = new ConcreateIterater(this);
m_begin->m_nIndex = 0;
}
return *m_begin;
}
template
ConcreateIterater& ConcreateAggregate::end()
{
if (m_end == NULL)
{
m_end = new ConcreateIterater(this);
m_end->m_nIndex = m_aData.size();
}
return *m_end;
}
template
void ConcreateAggregate::push_back(DATA dt)
{
m_aData.push_back(dt);
}
template
DATA ConcreateAggregate::pop_back()
{
DATA tmp = m_aData.back();
m_aData.pop_back();
return tmp;
}
template
int ConcreateAggregate::GetSize()
{
return m_aData.size();
}
template
DATA ConcreateAggregate::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
#include
#include
using namespace std;
//提供一种方法顺序访问一个聚合对象中各个元素,,而又不需暴露该对象的内部表示.
typedef ConcreateAggregate dmVector;
typedef ConcreateAggregate mVector;
typedef ConcreateIterater 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
1659628745
查看更多评论