Скачиваний:
16
Добавлен:
01.05.2014
Размер:
182.27 Кб
Скачать

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;

}

}

Соседние файлы в папке Лабораторная работа 15