Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа 25 / lab22 / 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);
}
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