Учебные материалы по математике | Построение итераторов для динамических структур данных | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Построение итераторов для динамических структур данных


stack. push(std::shared_ptr<Triangle>(new Triangle(3,3,3)));

std::cout << stack;

std::shared_ptr<Triangle> t;

t = stack. pop(); std::cout << *t << std::endl;

t = stack. pop(); std::cout << *t << std::endl;

t = stack. pop(); std::cout << *t << std::endl;

return 0;

}

Лабораторная работа №5

Цель работы

Целью лабораторной работы является:

·  Закрепление навыков работы с шаблонами классов.

·  Построение итераторов для динамических структур данных.

Задание

Используя структуры данных, разработанные для предыдущей лабораторной работы (ЛР№4) спроектировать и разработать Итератор для динамической структуры данных.

Итератор должен быть разработан в виде шаблона и должен уметь работать со всеми типами фигур, согласно варианту задания.

Итератор должен позволять использовать структуру данных в операторах типа for. Например:

for(auto i : stack) std::cout << *i << std::endl;

Нельзя использовать:

·  Стандартные контейнеры std.

Программа должна позволять:

·  Вводить произвольное количество фигур и добавлять их в контейнер.

·  Распечатывать содержимое контейнера.

·  Удалять фигуры из контейнера.

Полезный пример

Данный пример демонстрирует основные возможности языка C++, которые понадобится применить в данной лабораторной работе. Пример не является решением варианта лабораторной работы.

Листинг файла TStack. h

#ifndef TSTACK_H

#define TSTACK_H

#include "Triangle. h"

#include "TStackItem. h"

#include "TIterator. h"

#include <memory>

template <class T> class TStack {

public:

TStack();

void push(std::shared_ptr<T> &&item);

bool empty();

std::shared_ptr<T> pop();

TIterator<TStackItem<T>,T> begin();

TIterator<TStackItem<T>,T> end();

template <class A> friend std::ostream& operator<<(std::ostream& os, const TStack<A>& stack);

virtual ~TStack();

private:

std::shared_ptr<TStackItem<T>> head;

};

#endif /* TSTACK_H */

Листинг файла TStack. CPP

#include "TStack. h"

template <class T> TStack<T>::TStack() : head(nullptr) {

}

template <class T> std::ostream& operator<<(std::ostream& os, const TStack<T>& stack) {

std::shared_ptr<TStackItem<T>> item = stack. head;

while(item!=nullptr)

{

os << *item;

item = item->GetNext();

}

return os;

}

template <class T> void TStack<T>::push(std::shared_ptr<T> &&item) {

std::shared_ptr<TStackItem<T>> other(new TStackItem<T>(item));

other->SetNext(head);

head = other;

}

template <class T> bool TStack<T>::empty() {

return head == nullptr;

}

template <class T> std::shared_ptr<T> TStack<T>::pop() {

std::shared_ptr<T> result;

if (head!= nullptr) {

result = head->GetValue();

head = head->GetNext();

}

return result;

}

template <class T> TIterator<TStackItem<T>,T> TStack<T>::begin()

{

return TIterator<TStackItem<T>,T>(head);

}

template <class T> TIterator<TStackItem<T>,T> TStack<T>::end()

{

return TIterator<TStackItem<T>,T>(nullptr);

}

template <class T> TStack<T>::~TStack() {

}

#include "Triangle. h"

template class TStack<Triangle>;

template std::ostream& operator<<(std::ostream& os, const TStack<Triangle>& stack);

Листинг файла TIterator. h

#ifndef TITERATOR_H

#define TITERATOR_H

#include <memory>

#include <iostream>

template <class node, class T>

class TIterator

{

public:

TIterator(std::shared_ptr<node> n) {

node_ptr = n;

}

std::shared_ptr<T> operator * (){

return node_ptr->GetValue();

}

std::shared_ptr<T> operator -> (){

return node_ptr->GetValue();

}

void operator ++ (){

node_ptr = node_ptr->GetNext();

}

TIterator operator ++ (int){

TIterator iter(*this);

++(*this);

return iter;

}

bool operator == (TIterator const& i){

return node_ptr == i. node_ptr;

}

bool operator!= (TIterator const& i){

return!(*this == i);

}

private:

std::shared_ptr<node> node_ptr;

};

Листинг файла TStackItem. h

#ifndef TSTACKITEM_H

#define TSTACKITEM_H

#include <memory>

template<class T> class TStackItem {

public:

TStackItem(const std::shared_ptr<T>& triangle);

template<class A> friend std::ostream& operator<<(std::ostream& os, const TStackItem<A>& obj);

std::shared_ptr<TStackItem<T>> SetNext(std::shared_ptr<TStackItem> &next);

std::shared_ptr<TStackItem<T>> GetNext();

std::shared_ptr<T> GetValue() const;

void * operator new (size_t size);

void operator delete(void *p);

virtual ~TStackItem();

private:

std::shared_ptr<T> item;

std::shared_ptr<TStackItem<T>> next;

};

#endif /* TSTACKITEM_H */

Листинг файла TStackItem. cpp

#include "TStackItem. h"

#include <iostream>

template <class T> TStackItem<T>::TStackItem(const std::shared_ptr<T>& item) {

this->item = item;

this->next = nullptr;

std::cout << "Stack item: created" << std::endl;

}

template <class T> std::shared_ptr<TStackItem<T>> TStackItem<T>::SetNext(std::shared_ptr<TStackItem<T>> &next) {

std::shared_ptr<TStackItem < T>> old = this->next;

this->next = next;

return old;

}

template <class T> std::shared_ptr<T> TStackItem<T>::GetValue() const {

return this->item;

}

template <class T> std::shared_ptr<TStackItem<T>> TStackItem<T>::GetNext() {

return this->next;

}

template <class T> TStackItem<T>::~TStackItem() {

std::cout << "Stack item: deleted" << std::endl;

}

template <class A> std::ostream& operator<<(std::ostream& os, const TStackItem<A>& obj) {

os << "[" << *obj. item << "]" << std::endl;

return os;

}

template <class T> void * TStackItem<T>::operator new (size_t size) {

std::cout << "Allocated :" << size << "bytes" << std::endl;

return malloc(size);

}

template <class T> void TStackItem<T>::operator delete(void *p) {

std::cout << "Deleted" << std::endl;

free(p);

}

#include "Triangle. h"

template class TStackItem<Triangle>;

template std::ostream& operator<<(std::ostream& os, const TStackItem<Triangle>& obj);

Листинг файла Triangle. h

#ifndef TRIANGLE_H

#define TRIANGLE_H

#include <cstdlib>

#include <iostream>

class Triangle {

public:

Triangle();

Triangle(size_t i, size_t j, size_t k);

Triangle(const Triangle& orig);

friend std::ostream& operator<<(std::ostream& os, const Triangle& obj);

Triangle& operator=(const Triangle& right);

virtual ~Triangle();

private:

size_t side_a;

size_t side_b;

size_t side_c;

};

#endif /* TRIANGLE_H */

Листинг файла Triangle. cpp

#include "Triangle. h"

#include <iostream>

Triangle::Triangle() : Triangle(0, 0, 0) {

std::cout << "Triangle created: default" << std::endl;

}

Triangle::Triangle(size_t i, size_t j, size_t k) : side_a(i), side_b(j), side_c(k) {

std::cout << "Triangle created: " << side_a << ", " << side_b << ", " << side_c << std::endl;

}

Triangle::Triangle(const Triangle& orig) {

std::cout << "Triangle copy created" << std::endl;

side_a = orig. side_a;

side_b = orig. side_b;

side_c = orig. side_c;

}

Triangle& Triangle::operator=(const Triangle& right) {

if (this == &right) return *this;

std::cout << "Triangle copied" << std::endl;

side_a = right. side_a;

side_b = right. side_b;

side_c = right. side_c;

return *this;

}

Triangle::~Triangle() {

std::cout << "Triangle deleted" << std::endl;

}

std::ostream& operator<<(std::ostream& os, const Triangle& obj) {

os << "a=" << obj. side_a << ", b=" << obj. side_b << ", c=" << obj. side_c;

return os;

}

Листинг файла main. cpp

#include <cstdlib>

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020

А ты боишься COVID-19?

 Пройди опрос и получи промокод