|
size_t | get_dir_size () const |
| Retorna tamaño del directorio.
|
|
size_t | get_seg_size () const |
| Retorna tamaño del segmento.
|
|
size_t | get_block_size () const |
| Retorna tamaño del bloque.
|
|
size_t | size () const |
| Retorna dimensión actual (más lejano índice escrito)
|
|
size_t | max_size () const |
| Retorna máxima dimensión permitida.
|
|
size_t | get_num_blocks () const |
| Retorna la cantidad de bloques actualmente apartados.
|
|
void | set_default_initial_value (const T &value) |
|
void | set_default_initial_value (T &&value=T()) |
|
| DynArray (size_t _pow_dir, size_t _pow_seg, size_t _pow_block) throw (std::exception, std::bad_alloc, std::length_error, std::overflow_error) |
|
| DynArray (const size_t dim=0) throw (std::exception, std::bad_alloc, std::length_error, std::overflow_error) |
|
| DynArray (const DynList< T > &list) |
|
| ~DynArray () |
| Destructor que libera toda la memoria ocupada.
|
|
void | copy_array (const DynArray< T > &src_array) |
|
| DynArray (const DynArray< T > &array) throw (std::exception, std::bad_alloc) |
|
DynArray< T > & | operator= (const DynArray< T > &array) throw (std::exception, std::bad_alloc) |
|
void | swap (DynArray< T > &array) |
|
| DynArray (DynArray &&other) |
|
DynArray & | operator= (DynArray &&other) |
|
T & | access (const size_t i) |
|
T & | operator() (const size_t i) |
|
const T & | access (const size_t i) const |
|
const T & | operator() (const size_t i) const |
|
bool | exist (const size_t i) const throw (std::exception, std::out_of_range) |
|
T * | test (const size_t i) const |
|
T & | touch (const size_t i) throw (std::exception, std::bad_alloc, std::out_of_range) |
|
void | reserve (const size_t l, const size_t r) throw (std::exception, std::bad_alloc, std::domain_error, std::length_error) |
|
void | reserve (const size_t dim) |
|
void | cut (const size_t new_dim=0) throw (std::exception, std::domain_error) |
|
void | empty () |
|
Proxy | operator[] (const size_t i) const throw (std::exception, std::bad_alloc, std::length_error, std::invalid_argument) |
|
Proxy | operator[] (const size_t i) throw (std::exception, std::length_error, std::invalid_argument, std::bad_alloc) |
|
T & | append () |
|
T & | append (const T &data) |
|
T & | append (T &&data) |
|
void | push (const T &data) |
| Inserta como en una pila un elemento al final del arreglo.
|
|
T & | push () |
| Aparta un elemento al final del arrreglo.
|
|
bool | is_empty () |
|
T | pop () |
| Elimina el último elemento del arreglo como si fuese una pila.
|
|
T & | top () |
| Retorna el último elemento del arreglo como si fuese una pila.
|
|
T & | get_first () |
| Retorna el último elemento del arreglo como si fuese una cola.
|
|
T & | get_last () |
| Retorna el primer elemento del arreglo como si fuese una cola.
|
|
template<class Operation > |
bool | traverse (Operation &operation) const |
|
template<class Operation > |
bool | traverse (Operation &operation) |
|
template<class Operation > |
bool | traverse (Operation &&operation=Operation()) const |
|
template<class Operation > |
bool | traverse (Operation &&operation=Operation()) |
|
| Functional_Methods (T) |
|
template<typename T>
class Aleph::DynArray< T >
Arreglo dinámico perezoso.
Esta clase implementa arreglo dinámicos perezosos. Por dinámico se entiende que la memoria es automáticamente apartada en función de la dimensión. Por perezoso se entiende que la memoria puede apartarse en tiempo de escritura.
- Parámetros
-
T | El tipo de dato del arreglo. |
Un arreglo dinámico maneja tres valores muy importantes que determinan su dinamismo. Estos valores son llamados:
- block_size: Idealmente, un arreglo dinámico puede verse como una agrupación de bloques de tamaño block_size. Inicialmente, el arreglo dinámico no tiene ningún bloque apartado. Cuando por primera vez se escribe una entrada b[i], se aparta un bloque que albergará a b[i] y sus entradas aledañas. A medida que el valor de block_size sea mayor, se requerirá apelar menos al manejador de memoria y se aprovechará más la localidad de referencia dada por el cache de hardware, pero como el bloque es continuo la probabilidad de falla por memoria aumenta. Un valor pequeño hace más probable apartar memoria
- seg_size: los bloques se indizan mediante un arreglo llamado segmento.
- dir_size: a su vez, los segmentos se indizan en otro arreglo llamado directorio.
Para lograr un acceso constante lo más eficiente posible, estos tamaños son potencias exactas de dos.
Un arreglo dinámico recién inicializado sólo ocupa un arreglo continuo correspondiente al directorio.
La máxima dimensión del arreglo dinámico está limitada por dir_size x seg_size x block_size elementos.
El arreglo dinámico maneja una dimensión actual, la cual se especifica en tiempo de construcción y que se expande automáticamente si se escriben entradas por encima de la dimensión actual.
Los elementos pueden accederse de diversas formas. Siendo la principal mediante el tradicional operador [], la cual realiza todas las verificaciones de rango, aparta automáticamente la memoria y puede expandir la dimensión.
Puesto que la unidad de apartado de memoria es el bloque, no hay garantía de que una entrada leída se corresponda con una ya escrita.
Acceso rápido sin validación.
Esta rutina accede al i-ésimo elemento del arreglo de la manera más rápida posible en detrimento de verificar si la entrada existe, bien sea porque no ha sido escrita o porque está fuera de rango.
El fin de esta función es realizar un acceso a la velocidad máxima bajo la certitud de utilización.
Independientemente que el acceso sea o no válido, esta fuunción actualiza la dimensión actual del arreglo en caso de que el índice i sea mayor.
- Parámetros
-
[in] | i | índice de la entrada de acceso. |
- Nota
- Úsese con extremo cuidado. Si la entrada no tiene un bloque apartado, entonces, en el mejor de los casos, habrá una falla de memoria con su correspondiente excepción del sistema operativo. De lo contrario, entonces el acceso será realizado pero ello no implica que sea correcto.
- Ver también
- exist
Referenciado por Aleph::binary_search(), Aleph::bubble_sort(), Aleph::Compute_Cut_Nodes< GT, SA >::compute_blocks(), Aleph::DynArray< pthread_mutex_t >::copy_array(), Aleph::heapsort(), Aleph::insertion_sort(), Aleph::kosaraju_connected_components(), Aleph::IO_Graph< GT, Load_Node, Store_Node, Load_Arc, Store_Arc, NF, AF >::load(), Aleph::IO_Graph< GT, Load_Node, Store_Node, Load_Arc, Store_Arc, NF, AF >::load_in_text_mode(), Aleph::Matrix_Graph< GT, SA >::operator()(), Aleph::BitArray::read(), DynArray_Set< T, Equal >::remove(), Aleph::BitArray::save(), Aleph::BitArray::save_in_array_of_chars(), DynArray_Set< T, Equal >::search(), Aleph::search_cycle(), Aleph::search_extreme(), Aleph::selection_sort(), Aleph::sequential_search(), Aleph::shellsort() y Aleph::BitArray::write().
template<typename T>
void Aleph::DynArray< T >::reserve |
( |
const size_t |
l, |
|
|
const size_t |
r |
|
) |
| |
throw | ( | std::exception, |
| | std::bad_alloc, |
| | std::domain_error, |
| | std::length_error |
| ) | | |
|
inline |
Reserva un rango de memoria.
reserve(l, r) verifica el rango de entradas del arreglo comprendido entre l y r y asegura que haya memoria.
- Parámetros
-
[in] | l | índice inferior |
[in] | r | índice superior |
- Excepciones
-
std::bad_alloc | si no hay suficiente memoria. En ese caso, no hay manera precisa de saber hasta donde ha sido apartada la memoria. Si l es mayor que la antigua dimensión, entonces el valor de la dimensión actual estará modificado hasta el último bloque apartado. |
domain_error | si l es mayor que r |
length_error | si r es mayor que la máxima dimensión. |
Referenciado por Aleph::Compute_Cut_Nodes< GT, SA >::compute_blocks(), Aleph::IO_Graph< GT, Load_Node, Store_Node, Load_Arc, Store_Arc, NF, AF >::load(), Aleph::IO_Graph< GT, Load_Node, Store_Node, Load_Arc, Store_Arc, NF, AF >::load_in_text_mode() y Aleph::BitArray::reserve().