Скачиваний:
9
Добавлен:
01.05.2014
Размер:
2.33 Кб
Скачать
#pragma once
#include<vector>
#include<list>
#include "ErrorDelete.h"
#include "ErrorGet.h"

template <class T>
class ArSet
{	std::list<int> l;			//список непустых позиций
	std::vector<T> v;			//массив элементов

	void setSize()				//установка размера массива в зависимости от макс
	{							//индекса из l
		int maxsize=0;
		std::list<int>::iterator it;
		it=l.begin();

		while (it!=l.end())
		{
			if (*it>maxsize){maxsize=*it;}
			it++;
		}

		v.resize(maxsize+1);
	}

public:
	ArSet();

	std::list<int> getPosList();

	void insertEl(int pos,T elem);
	void deleteEl(int pos);

	T getElem(int pos);

	unsigned int count();

	void clean();

	T getElemByNom(int nom);
	
	bool checkPos(int pos)		//проверка наличия позиции pos в списке l
	{
		std::list<int>::iterator it;
		it=l.begin();
	
		while (it!=l.end())
		{
			if (*it==pos){return true;}
			it++;
		}
		return false;
	}

};

template <class T>
ArSet<T>::ArSet()
{}

template <class T>
void ArSet<T>::insertEl(int pos,T elem)		//вставка элемента
{
	std::list<int>::iterator it;
	it=l.begin();

	while (it!=l.end())
	{
		if (*it==pos){l.remove(pos);}
		it++;
	}

	l.push_back(pos);

	setSize();

	v[pos]=elem;
}

template <class T>						//удаление элемента
void ArSet<T>::deleteEl(int pos)
{
	if (checkPos(pos))
	{
		l.remove(pos);

		setSize();
	}
	else
	{throw ArSetErrorDel("deleteEl",pos);
	}
}


template <class T>					//возврат элемента по номеру позиции в массиве
T ArSet<T>::getElem(int pos)
{
	if (checkPos(pos))
	{
		return v[pos];
	}
	else
	{throw ArSetErrorGet("getElem",pos,l.size());		//если такой позиции нет, то вызов искл ситуации
	}
}

template <class T>	
std::list<int> ArSet<T>::getPosList()
{
	return l;
}

template <class T>
unsigned int ArSet<T>::count()
{
	return l.size();
}

template <class T>
void ArSet<T>::clean()
{
	l.clear();
	v.clear();
}

template <class T>				//возврат элемента по порядковуму номеру
T ArSet<T>::getElemByNom(int nom)
{
	if (l.size()<=nom)							//если номер больше допустимого, то вызов искл. ситуации
	{throw ArSetErrorGet("getElem",nom,l.size());
	}
	else
	{
		std::list<int>::iterator it;
		it=l.begin();

		for (int i=0;i<nom;i++)
		{
			it++;
		}

		return v[*it];
	}
}
Соседние файлы в папке lab22