Шаблон контейнер стандантного vector.

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

Напишите шаблон, реализующий контейнер с теми же функциями-членами и теми же типами, что и стандартный vector, для существующего (нестандартного) контейнерного типа. Не модифицируйте при этом существующий контейнерный тип. Как вы поступите с его функциональностью, не совпадающей со стандартной?

В общем от шаблон который у меня получился. Я просто все сделал по быстрому не долго разбираясь с итераторами, что да как, просто втулил по быстрому и все.

//klacc kak std::vector
//modificiryem v wablon
#include <iostream>
using std::cout;
using std::endl;

template <typename T>
class Vector
{
	int siz;
	T* mass;

public:
	typedef T* iter;
	typedef T& value;

	//class icklyuchenii
	class out_of_range{};

	//konctrykotr preobrazovani9
	Vector(int s):siz(s){mass=new T[s];}

	//konctryktor kopirovani9
	Vector(Vector& v):siz(v.siz)
	{
		mass=new T[v.siz];
		for(int i=0;i<siz;i++)
			mass[i]=v[i];
	}

	//vozvrat razmera size
	int size(){return siz;}

	//doctyp bez proverki
	value operator[](int i){return mass[i];}
	const T& operator[](int i)const{return mass[i];}

	//doctyp c proverkoi
	value at(int i)
	{
		if(i>=0&&i<siz)
			return mass[i];
		else
			throw out_of_range();
	}

	const value at(int i)const
	{
		if(i>=0&&i<siz)
			return mass[i];
		else
			throw out_of_range();
	}

	//front() vozvrat pervogo elementa
	value front(){return mass[0];}
	const T& front()const {return mass[0];}

	//vozvrat poclednego elementa
	value back(){return mass[siz-1];}
	const T& back()const {return mass[siz-1];}

	//begin()
	iter begin(){return mass;}
	//end()
	iter end(){return mass+siz;}

	//ctekovue operacii
	//dobavlenie v konec
	void push_back(const T& x)
	{
		siz=siz+1;
		T* yk=new T[siz];
		for(int i=0;i<siz-1;i++)
			yk[i]=mass[i];

		T* del=mass;
		mass=yk;

		delete del;//vucvobojdenie pam9ti
		mass[siz-1]=x;
	}

	//vuvod Vector
	void print()
	{
		for(int i=0;i<siz;i++)
			cout <<mass[i]<<' ';
		cout <<endl;
	}

	//ydalenie poclednego elementa
	void pop_back()
	{
		if(siz==0)
			throw out_of_range();

		siz-=1;
		T* yk=new T[siz];//vudel9em mecto pod novui macciv
		for(int i=0;i<siz;i++)
		{
			yk[i]=mass[i];
		}

		T* del=mass;
		mass=yk;
		delete del;//ocvobojdenie pam9ti
	}

	//operacii xarakternue dl9 cpickov

	iter insert(iter ptr, T znach)
	{
		siz+=1;
		T* yk=new T[siz];
		//poick mecta
		for(int i=0,j=0;j<siz;i++,j++)
		{
			if((mass+i)==ptr)
			{
				//naideno mecto dl9 vctavki
				yk[j]=znach;
				ptr=yk+j;
				i--;
			}
			else
			{
				yk[j]=mass[i];
			}
		}
		T* del=mass;
		mass=yk;
		delete del;
		return ptr;
	}

	iter erase(iter ptr)
	{
		siz-=1;
		int* yk=new int[siz];
		//poick elementa dl9 ydaleni9
		for(int i=0,j=0;i<siz+1;i++,j++)
		{
			if((mass+i)==ptr)
			{
				ptr=yk+j;
				j--;
				continue;
			}
			else
			{
				yk[j]=mass[i];
			}
		}

		T* del=mass;
		mass=yk;
		delete del;
		return ptr;
	}
};

int main()
{
	Vector<int> vec(5);
	cout <<vec.size()<<endl;

	//proverka operator[]
	for(int i=0;i<vec.size();i++)
		vec[i]=i;
	for(int i=0;i<vec.size();i++)
		cout <<"vec["<<i<<"]= "<<vec[i]<<endl;

	//proverka at()
	try
	{
		for(int i=0;i<6;i++)
			cout <<"vec.at("<<i<<")= "<<vec.at(i)<<endl;
	}
	catch(Vector<int>::out_of_range& e)
	{
		cout <<"out_of_range"<<endl;
	}

	//proverka front()
	cout <<"vec.fron()= "<<vec.front()<<endl;
	//proverka back()
	cout <<"vec.back()= "<<vec.back()<<endl;

	//proverka konctryktora kopii
	Vector<int> vec1(vec);
	for(int i=0;i<vec1.size();i++)
		cout <<"vec1["<<i<<"]= "<<vec1[i]<<endl;

	//proverka begin() i end()
	cout <<"vec.begin()= "<<*vec.begin()<<endl;
	cout <<"vec.end()= "<<vec.end()<<endl;
	//vce ok rabotaet

	//proverka push_back()
	cout <<"vec.size()= "<<vec.size()<<endl;
	vec.print();
	vec.push_back(3);
	cout <<"vec.size()= "<<vec.size()<<endl;
	vec.print();

	//proverka pop_back()
	cout <<"vec.size()= "<<vec.size()<<endl;
	vec.print();
	vec.pop_back();
	cout <<"vec.size()= "<<vec.size()<<endl;
	vec.print();

	vec.pop_back();
	cout <<"vec.size()= "<<vec.size()<<endl;
	vec.print();

	vec.pop_back();
	cout <<"vec.size()= "<<vec.size()<<endl;
	vec.print();

	//proverka insert()
	vec.insert(vec.begin(), 44);
	vec.print();

	//proverka erase()
	vec.erase(vec.begin());
	vec.print();
	vec.erase(vec.begin());
	vec.print();

	return 0;
}

“Как вы поступите с его функциональностью, не совпадающей со стандартной?” Да не как подумаешь не совпадает, зато можно и более лучшую функциональность добавить. Так что есть и свои плюсы, хотя минусов больше, лучше юзать готовое чем самому велосипед создавать.

rss