2. Применение стандартной библиотеки stl.
2.1. Составить консольные приложения, демонстрирующие основные операции с контейнерами и итераторами STL.
Заполняя 3 контейнера строками из <cstring> или другими элементами, продемонстрировать отличия - последовательностей (vector, list, dequeue); - адаптеров последовательностей (stack, queue, priority_queue); - ассоциативных контейнеров на базе map.
На примере заполнения одного контейнера-последовательности из предыдущего задания целыми числами, протестировать интерфейсы контейнера и итератора.
Аналогично протестировать ассоциативный контейнер, заполняя его указателями на разные графические объекты из разд. 1.1. Протестировать алгоритны-методы и алгоритмы-классы на множестве графических элементов.
2.2. Реализовать новый шаблон контейнера и шаблон итератора для него по индивидуальному заданию.
По индивидуальному заданию контейнер представляет собой множество на базе массива.
Диаграмма классов контейнеров приведена на рисунке 2:
Класс итератор для контейнера-множества является внешним итератором и использует функции контейнера.
Обработка исключительных ситуаций.
В программе обрабатываются три вида исключительных ситуаций: ошибка выделения памяти, запрос несуществующего значения, удаление несуществующего элемента.
Классы, соответствующие этим ситуациям: Error,ErrorDelete,ErrorGet.
Диаграмма классов исключительных ситуаций приведена на рисунке 3:
При возникновении исключительной ситуации, генерируется исключительная ситуация соответствующего типа, которая перехватывается в тестирующей программе.
Контейнер тестируется на графических объектах. Заполняя и удаляя объекты из контейнера.
Объявления и реализация контейнеров и итератора приведена ниже, а также тестирующая программа приведены ниже:
class ArSet
#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];
}
}
class ArSetIterator
#pragma once
#include "ArSet.h"
//итератор для множества
template <class T>
class ArSetIterator
{
int index;
ArSet<T>& ar;
public:
ArSetIterator(ArSet<T>& _ar):ar(_ar)
{index=0;}
void next()
{index++;}
void pred()
{index--;}
bool begin()
{if (index==0){return true;}
else
{return false;}
}
bool end()
{if (index==ar.count()){return true;}
else
{return false;}
}
T currentItem()
{
return ar.getElemByNom(index);
}
};
class ArSetError.h
#pragma once
#include <string>
//базовый класс ошибок
class ArSetError
{ std::string methodName;
public:
ArSetError();
ArSetError(std::string _methodName);
void setMethodName(std::string _methodName);
std::string getMethodName() const;
};
ArSetError.cpp
#include "Error.h"
ArSetError::ArSetError()
{methodName="";
}
ArSetError::ArSetError(std::string _methodName)
{methodName=_methodName;
}
void ArSetError::setMethodName(std::string _methodName)
{
methodName=_methodName;
}
std::string ArSetError::getMethodName() const
{
return methodName;
}
class ArSetErrorDelete.h
#include "Error.h"
//ошибка выбора несущ эл-та
class ArSetErrorDel:public ArSetError
{
int pos;
public:
ArSetErrorDel();
ArSetErrorDel(std::string _methodName,int _pos);
void setPos(int _pos);
int getPos();
};
ArSetErrorDelete.cpp
#include "ErrorDelete.h"
ArSetErrorDel::ArSetErrorDel():ArSetError()
{
}
ArSetErrorDel::ArSetErrorDel(std::string _methodName,int _pos)
:ArSetError(_methodName)
{pos=_pos;
}
void ArSetErrorDel::setPos(int _pos)
{pos=_pos;}
int ArSetErrorDel::getPos()
{return pos;
}
class ArSetErrorGet.h
#include "Error.h"
//ошибка выбора несущест. эл-та
class ArSetErrorGet:public ArSetError
{
int Index;
int Size;
public:
ArSetErrorGet();
ArSetErrorGet(std::string _methodName,int _Index,int _Size);
int getIndex() const;
void setIndex(int _index);
int getSize() const;
void setSize(int _Size);
};
ArSetErrorGet.cpp
#include "ErrorGet.h"
ArSetErrorGet::ArSetErrorGet():ArSetError()
{
Index=0;
Size=0;
}
ArSetErrorGet::ArSetErrorGet(std::string _methodName,int _Index,int _Size)
:ArSetError(_methodName)
{
Index=_Index;
Size=_Size;
}
int ArSetErrorGet::getSize() const
{
return Size;
}
void ArSetErrorGet::setIndex(int _index)
{
Index=_index;
}
int ArSetErrorGet::getIndex() const
{
return Index;
}
void ArSetErrorGet::setSize(int _Size)
{
Size=_Size;
}
testProg
#include<iostream>
#include "ArSet.h"
#include "ArSetIterator.h"
#include "TriangleEntity.h"
#include "TrapeziumEntity.h"
#include "TextEntity.h"
#include "TextTrapeziumEntity.h"
using namespace std;
void main()
{
Shape* Trig = new CTriangleEntity(10, 5, 10, 10);
Shape* Trap = new CTrapeziumEntity(3, 10, 5, 10, 10);
Shape* Sadd = new CTextEntity("SadSidoText");
Shape* Fin = new CTextTrapeziumEntity("TTE", 15, 30, 20, 10, 10);
ArSet<Shape*> ar;
ar.insertEl(1,Trig);
ar.insertEl(2,Trap);
ar.insertEl(100,Sadd);
ar.insertEl(200,Fin);
ArSetIterator<Shape*> it(ar);
while (!it.end())
{
cout<<it.currentItem()<<endl;
it.next();
}
cout<<"-------------------------"<<endl;
while (!it.begin())
{
it.pred();
cout<<it.currentItem()<<endl;
}
}