polyset · Optim

▶ Aprender polyset (Optim) paso a paso · explicación de polyset

Otras versiones: Cristi

Código línea a línea

Tres columnas: el código, el trozo del subject o del main que obliga a escribir esa línea, y el por qué.

searchable_array_bag.hpp
CódigoSubjectPor qué
#pragma onceQue el .hpp no se incluya dos veces.
#include "array_bag.hpp"array_bag: an implementation of a bag with an array an underlying dataTe lo dan: el bag con array del que heredo.
#include "searchable_bag.hpp"searchable_bag: an abstract class representing a bag with the ability toTe lo dan: la clase abstracta con has que tengo que cumplir.
class searchable_array_bag : public array_bag, public searchable_bagthat will inherit from
array_bag and tree_bag and implement the searchable bag abstract class.
Hereda de los dos: de array_bag saco insert/print/clear hechos; de searchable_bag la obligación de tener has. Y así cabe en un searchable_bag *.
{
public:You will find in this dir a main that must compile with your code.Todo lo que usa el main.
searchable_array_bag();searchable_bag *a = new searchable_array_bag;Constructor vacío.
searchable_array_bag(const searchable_array_bag& other);const searchable_array_bag tmp(static_cast<searchable_array_bag &>(*a));Copia: el main la usa para tmp.
searchable_array_bag& operator=(const searchable_array_bag& other);All classes should be under orthodox canonical form.Asignación: forma canónica.
~searchable_array_bag();All classes should be under orthodox canonical form.Destructor: forma canónica.
bool has(int value) const;std::cout << a->has(atoi(argv[i])) << std::endl;
tmp.has(1);
Lo único nuevo. const al final porque tmp es const (y searchable_bag lo declara así).
};
searchable_array_bag.cpp
CódigoSubjectPor qué
#include "searchable_array_bag.hpp"Expected File: searchable_array_bag.cpp, searchable_array_bag.hpp,El .cpp incluye su .hpp.
// ---------- forma canónica ----------
searchable_array_bag::searchable_array_bag() : array_bag() {}searchable_bag *a = new searchable_array_bag;Vacío: que construya el padre.
searchable_array_bag::searchable_array_bag(const searchable_array_bag& other) : array_bag(other) {}const searchable_array_bag tmp(static_cast<searchable_array_bag &>(*a));Copia: se la paso al padre, que es quien tiene los datos.
searchable_array_bag& searchable_array_bag::operator=(const searchable_array_bag& other)All classes should be under orthodox canonical form.Me cambia y me devuelvo a mí → &.
{
if (this != &other)Si me asigno a mí mismo, nada que hacer.
array_bag::operator=(other);Los datos son del padre: que copie él.
return *this;Me devuelvo a mí.
}
searchable_array_bag::~searchable_array_bag() {}Nada que liberar: lo libera el padre.
// ---------- búsqueda ----------
bool searchable_array_bag::has(int value) constSince a bag without a searching function isn't very useful, implement twoBuscar en el array.
{
for (int i = 0; i < size; i++)Recorro data[0..size): size y data vienen de array_bag.
{
if (data[i] == value)¿Es este?
return true;Encontrado.
}
return false;Recorrí todo y no está.
}
searchable_tree_bag.hpp
CódigoSubjectPor qué
#pragma onceQue el .hpp no se incluya dos veces.
#include "tree_bag.hpp"tree_bag: an implementation of a bag with a binary search tree as underlyingTe lo dan: el bag con árbol del que heredo.
#include "searchable_bag.hpp"searchable_bag: an abstract class representing a bag with the ability toTe lo dan: la clase abstracta con has que tengo que cumplir.
class searchable_tree_bag : public tree_bag, public searchable_bagthat will inherit from
array_bag and tree_bag and implement the searchable bag abstract class.
Lo mismo con el árbol: tree_bag trae lo hecho, searchable_bag pide has.
{
public:You will find in this dir a main that must compile with your code.Todo lo que usa el main.
searchable_tree_bag();searchable_bag *t = new searchable_tree_bag;Constructor vacío.
searchable_tree_bag(const searchable_tree_bag& other);All classes should be under orthodox canonical form.Copia: forma canónica.
searchable_tree_bag& operator=(const searchable_tree_bag& other);All classes should be under orthodox canonical form.Asignación: forma canónica.
~searchable_tree_bag();All classes should be under orthodox canonical form.Destructor: forma canónica.
bool has(int value) const;std::cout << a->has(atoi(argv[i])) << std::endl;
tmp.has(1);
Lo único nuevo. const al final porque tmp es const (y searchable_bag lo declara así).
};
searchable_tree_bag.cpp
CódigoSubjectPor qué
#include "searchable_tree_bag.hpp"searchable_tree_bg.cpp, searchable_tree_bag.hpp, set.cpp, set.hppEl .cpp incluye su .hpp.
// ---------- forma canónica ----------
searchable_tree_bag::searchable_tree_bag() : tree_bag() {}searchable_bag *t = new searchable_tree_bag;Vacío: que construya el padre.
searchable_tree_bag::searchable_tree_bag(const searchable_tree_bag& other) : tree_bag(other) {}Copia: se la paso al padre.
searchable_tree_bag& searchable_tree_bag::operator=(const searchable_tree_bag& other)Me cambia y me devuelvo a mí → &.
{
if (this != &other)Si me asigno a mí mismo, nada que hacer.
tree_bag::operator=(other);El árbol es del padre: que copie él.
return *this;Me devuelvo a mí.
}
searchable_tree_bag::~searchable_tree_bag() {}Nada que liberar: lo libera el padre.
// ---------- búsqueda ----------
bool searchable_tree_bag::has(int value) consttree_bag: an implementation of a bag with a binary search tree as underlyingBuscar en el árbol binario: menor a la izquierda, mayor a la derecha.
{
node *current = tree;Empiezo en la raíz (tree viene de tree_bag).
while (current)Mientras haya nodo.
{
if (value == current->value)¿Es este?
return true;Encontrado.
if (value < current->value)Menor → a la izquierda.
current = current->l;Bajo por la izquierda.
else
current = current->r;Si no, por la derecha.
}
return false;Recorrí todo y no está.
}
set.hpp
CódigoSubjectPor qué
#pragma onceQue el .hpp no se incluya dos veces.
#include "searchable_bag.hpp"searchable_bag: an abstract class representing a bag with the ability toTe lo dan: la clase abstracta con has que tengo que cumplir.
class setImplement the class set that will wrap a searchable_bag and turn it into a set.Envuelve una bag: no la copia, trabaja sobre ella.
{
private:Solo lo toca la clase.
searchable_bag& bag;wrap a searchable_bagReferencia a la bag del main: el set NO tiene datos propios.
set();All classes should be under orthodox canonical form.Privado y sin cuerpo: una referencia no puede nacer vacía. Existe solo por la forma canónica.
set(const set& other);All classes should be under orthodox canonical form.Privado: copiar un set no tiene sentido (compartirían bag).
set& operator=(const set& other);All classes should be under orthodox canonical form.Privado: una referencia no se puede reasignar.
public:You will find in this dir a main that must compile with your code.Todo lo que usa el main.
set(searchable_bag& b);set sa(*a);
set st(*t);
El constructor de verdad: recibe la bag del main.
~set();No borra nada: la bag es del main.
void insert(int value);st.insert(atoi(argv[i]));Meter uno.
void insert(int *values, int count);sa.insert(intArr, sizeof(intArr) / sizeof(int));Meter un array.
bool has(int value) const;std::cout << a->has(atoi(argv[i])) << std::endl;
tmp.has(1);
Lo único nuevo. const al final porque tmp es const (y searchable_bag lo declara así).
void print() const;sa.print();Imprimir, sin tocar nada → const.
void clear();sa.clear();Vaciar.
const searchable_bag& get_bag() const;sa.get_bag().print();Dos const: lo que doy no se toca, y yo no me toco.
};
set.cpp
CódigoSubjectPor qué
#include "set.hpp"set.cpp, set.hppEl .cpp incluye su .hpp.
// ---------- forma canónica ----------
set::set(searchable_bag& b) : bag(b) {}set sa(*a);La referencia se rellena en la lista : bag(b), nunca dentro de {}.
set::~set() {}No borra nada: la bag es del main.
// ---------- lo que hace de set un set ----------
void set::insert(int value)turn it into a setEsto es lo que lo hace un set.
{
if (!bag.has(value))Solo si no está ya…
bag.insert(value);…lo meto. Sin repetidos.
}
void set::insert(int *values, int count)sa.insert(intArr, sizeof(intArr) / sizeof(int));Un array: uno a uno.
{
for (int i = 0; i < count; i++)Cada elemento…
insert(values[i]);…con el insert de uno: así tampoco mete repetidos.
}
// ---------- se lo pasa a la bag ----------
bool set::has(int value) constsa.has(atoi(argv[i]));Se lo pasa a la bag.
{
return bag.has(value);
}
void set::print() constsa.print();Se lo pasa a la bag.
{
bag.print();
}
void set::clear()sa.clear();Se lo pasa a la bag.
{
bag.clear();
}
const searchable_bag& set::get_bag() constsa.get_bag().print();Devuelvo la bag, de solo lectura.
{
return bag;
}