 
        
        
          Добавил:
          
          
        
        
    
            Studfiles2
            
            
            
            
            
            Опубликованный материал нарушает ваши авторские права? Сообщите нам.
          
          Вуз:
          Предмет:
          Файл:Лабораторная работа 15 / templ / ArSet
.h#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);
	}
	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;
	}
public:
	ArSet();
	void insertEl(int pos,T elem);
	void deleteEl(int pos);
	T getElem(int pos);
	unsigned int count();
	void clean();
	T getElemByNom(int nom);
};
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>
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];
	}
}