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ódigo | Subject | Por qué |
|---|---|---|
#pragma once | Que el .hpp no se incluya dos veces. | |
| ||
#include "array_bag.hpp" | array_bag: an implementation of a bag with an array an underlying data | Te lo dan: el bag con array del que heredo. |
#include "searchable_bag.hpp" | searchable_bag: an abstract class representing a bag with the ability to | Te lo dan: la clase abstracta con has que tengo que cumplir. |
| ||
class searchable_array_bag : public array_bag, public searchable_bag | that 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ódigo | Subject | Por 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) const | Since a bag without a searching function isn't very useful, implement two | Buscar 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ódigo | Subject | Por qué |
|---|---|---|
#pragma once | Que el .hpp no se incluya dos veces. | |
| ||
#include "tree_bag.hpp" | tree_bag: an implementation of a bag with a binary search tree as underlying | Te lo dan: el bag con árbol del que heredo. |
#include "searchable_bag.hpp" | searchable_bag: an abstract class representing a bag with the ability to | Te lo dan: la clase abstracta con has que tengo que cumplir. |
| ||
class searchable_tree_bag : public tree_bag, public searchable_bag | that 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ódigo | Subject | Por qué |
|---|---|---|
#include "searchable_tree_bag.hpp" | searchable_tree_bg.cpp, searchable_tree_bag.hpp, set.cpp, set.hpp | El .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) const | tree_bag: an implementation of a bag with a binary search tree as underlying | Buscar 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ódigo | Subject | Por qué |
|---|---|---|
#pragma once | Que el .hpp no se incluya dos veces. | |
| ||
#include "searchable_bag.hpp" | searchable_bag: an abstract class representing a bag with the ability to | Te lo dan: la clase abstracta con has que tengo que cumplir. |
| ||
class set | Implement 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_bag | Referencia 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ódigo | Subject | Por qué |
|---|---|---|
#include "set.hpp" | set.cpp, set.hpp | El .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 set | Esto 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) const | sa.has(atoi(argv[i])); | Se lo pasa a la bag. |
{ | ||
return bag.has(value); | ||
} | ||
| ||
void set::print() const | sa.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() const | sa.get_bag().print(); | Devuelvo la bag, de solo lectura. |
{ | ||
return bag; | ||
} |