Итератор для Vector.

Рубрика: C++, Дата: 10 May, 2013, Автор:

Напишите такой итератор, чтобы Vector из параграфа 16.5.2 мог использоваться в стиле контейнера из параграфа 16.2.1 .

Ссылка на пример Vector из 16.5.2 http://www.kselax.ru/2013/05/klassy-container-vector-i-list/  . 

Так ладно щас будем придумывать как же это все нам реализовать щас. Все не так то просто как кажется, а может быть и сильно просто. Ладно решаем.

Вот кое какой код вроде написал:

//dorabotka konteinera c obchim bazovum klaccom
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;

struct Object
{
	Object* pre;
	Object* next;
	//...
public:
	//konctryktor po ymolchaniyu
	Object():pre(0),next(0){}

	//virtual6nui dectryktor
	virtual ~Object(){};
};

class Container : public Object
{
public:
	struct Bad_op//klacc icklyuchenii
	{
		const char* p;
		Bad_op(const char* pp):p(pp){}
	};
	
	virtual void put(Object*){throw Bad_op("put");}
	virtual Object* get() {throw Bad_op("get");}
	virtual Object*& operator[](int){throw Bad_op("[]");}
	
	//...
};

class List : public Container
{
	//ykazatel6 na ob6ekt
	Object* tek;
public:
	//konctryktor po ymolchaniyu
	List():tek(0){}

	//ydal9et i vozvrachaet element iz cpicka
	Object* get()
	{
		cout <<"Mu v get"<<endl;
		cout << pre<<' '<< next<<' '<<endl;
		if(tek==0)
		{
			cout <<"cpicok pyct , avariinoe zaverwenie ... "<<endl;
			exit(1);
		}
		else
		{
			cout <<"ect6 elementu"<<endl;
			Object* temp=tek;
			tek=tek->pre;
			temp->pre=0;
			return temp;
		}

		return pre;
	}
	
	//dobavl9et element v cpicok
	void put(Object* a)
	{
		cout <<"Mu v put"<<endl;
		if(tek==0)
		{
			cout <<"cpicok pyct"<<endl;
			tek=a;
		}
		else
		{
			cout <<"ect6 elementu"<<endl;
			tek->next=a;
			a->pre=tek;
			tek=a;
		}
	}
	//...
};

class Vector : public Container
{
	Object* tek;//pervui element;
	int size;//razmer
public:
	//konctryktor preobrazovani9
	Vector(int i):size(i),tek(0){}
	//konctryktor kopii (doljen ykazuvat6 na odin i tot je vektor)
	Vector(Vector& a):tek(a.tek),size(a.size){} 

	//dabavit6 elementu
	void put(Object* a)
	{
		cout <<"Mu v put"<<endl;
		if(tek==0)
		{
			cout <<"vector pyct"<<endl;
			if(size!=0)
				tek=a;
		}
		else
		{
			cout <<"vector ect6 elementu"<<endl;
			Object* temp=tek;
			tek->next=a;
			a->pre=tek;
			tek=a;
		}
	}

	//indekc
	Object*& operator[](int a)
	{
		cout <<"Mu cdec6"<<endl;
		if(a==0)
			return tek;
		else
		{
			if(a>0&&a<size)
			{
				int count=0;
				Object* t = opHelper(a,tek->pre,count);
				cout <<"t= "<<t<<endl;
				return t;
			}
		}
		//return 0;
	}

	Object* getTek()
	{
		return tek;
	}
	int getSize()
	{
		return size;
	}

	//opHelper
	Object*& opHelper(int& a, Object* Ptr,int& count)
	{
		if(Ptr!=0&&++count==a)
		{
			cout <<"a= "<<a<<" cout= "<<count<<endl;
			cout <<"MU TYT"<<endl;
			//exit(1);
			cout <<"Ptr= "<<Ptr<<endl;
			return Ptr;
		}
		else if(Ptr!=0&&count!=a)
			opHelper(a,Ptr->pre,count);
		else
		{
			cout <<"element ne cozdan"<<endl;
			exit(1);
		}
	}
	//...
};

//piwem iterator dl9 Vector
class Vector_it : public Vector
{
	int elem;
public:
	//konctyrktor po ymolchaniyu
	Vector_it(Vector& a):Vector(a),elem(0){}
	
	//perevod k cledywemy elementy
	void next()
	{
		cout <<"Mu cdec6"<<endl;
		cout <<"getSize()= "<<getSize()<<endl;
		if(getSize()>elem)
			elem++;
		else
		{
			cout <<"Owibka perepolneni9 "<<endl;
			exit(1);
		}
	}

	Object*& operator*()
	{
		cout <<"mu v operator*()"<<endl;
		cout <<"elem= "<<elem<<endl;
		return operator[](elem);
	}
};

class Ship : public Object
{
public:
	int data;
	//konctryktor preobrazovani9
	Ship(int a):data(a){};
};

int main()
{
	List L;

	Ship a(4);
	cout <<"a.data= "<<a.data<<endl;
	L.put(&a);
	Ship b(5);
	L.put(&b);
	Ship c(6);
	L.put(&c);
	Ship* ptr;
	ptr=dynamic_cast<Ship*>(L.get());
	cout <<"ptr->data= "<<ptr->data<<endl;
	ptr=dynamic_cast<Ship*>(L.get());
	cout <<"ptr->data= "<<ptr->data<<endl;
	ptr=dynamic_cast<Ship*>(L.get());
	cout <<"ptr->data= "<<ptr->data<<endl;
	//ptr=dynamic_cast<Ship*>(L.get());
	//cout <<"ptr->data= "<<ptr->data<<endl;
	//cout <<"*L.get()= "<<*(L.get())<<endl;;
	try
	{
		L[2];
	}
	catch(Container::Bad_op& a)
	{
		cout <<"Bad_op"<<endl;			
	}
	
	Vector V(5);
	V.put(&a);
	V.put(&b);
	V.put(&c);
	
	ptr=dynamic_cast<Ship*>(V[0]);
	cout <<"ptr->data= "<<ptr->data<<endl;
	ptr=dynamic_cast<Ship*>(V[1]);
	cout <<"ptr->data= "<<ptr->data<<endl;
	ptr=dynamic_cast<Ship*>(V[2]);
	cout <<"ptr->data= "<<ptr->data<<endl;
	//ptr=dynamic_cast<Ship*>(V[3]);
	//cout <<"ptr->data= "<<ptr->data<<endl;//tyt proicxodit octanovka programmu, poetomy mu ee zakomentirovali

	//putaemc9 cozdat6 iterator
	Vector_it it(V);
	//it.next();//doljen vukinyt6 cledychii element
	*it;//razuvenovuvaem
	ptr=dynamic_cast<Ship*>(*it);
	cout <<"ptr->data= "<<ptr->data<<endl;//6 (5,4)
	it.next();//perexod k cledychemy elementy
	ptr=dynamic_cast<Ship*>(*it);
	cout <<"ptr->data= "<<ptr->data<<endl;//6 (5,4)

	it.next();//perexod k cledychemy elementy
	ptr=dynamic_cast<Ship*>(*it);
	cout <<"ptr->data= "<<ptr->data<<endl;//6 (5,4)

	//proicxodit octanovka potomy chto ne cozdan element
	it.next();//perexod k cledychemy elementy
	ptr=dynamic_cast<Ship*>(*it);
	cout <<"ptr->data= "<<ptr->data<<endl;//6 (5,4)

	return 0;
}

Просто наследование сделал от класса Vector (Vector_it : public Vector) ну а дальше уже все как положено, добавил конструктор копий и все. Вообще то можно б было добавить эту возможность в сам Vector.

[youtube]http://www.youtube.com/watch?v=_I5vzGZUmz4[/youtube]

rss