Plantillas (templates)

]]>
Funciones libres plantilla. C++ las expandirá con cualquier tipo de datos con que se usen en tiempo de compilación. Obtener código fuente.

Clase Array

]]>
]]>
]]>
Una clase plantilla que implementa un arreglo dinámico. Obtener código fuente.

Clase Queue

El siguiente listado implementa un contenedor cola simplemente enlazada. Las inserciones al inicio o final de la cola son muy eficientes. Pero para acceder a un valor, se requiere recorrer todos los elementos previos. Se provee una clase Iterator para poder hacer este recorrido.

]]>
]]>
Una clase plantilla que implementa una cola enlazada. Obtener código fuente.

Clase BinarySearchTree

En un árbol binario de búsqueda cada nodo conoce cuales son sus nodos hijos: uno a la izquierda y otro a la derecha, de tal forma que cualquier nodo que se encuentre a la izquierda tiene un valor menor que el nodo y a la derech a un valor mayor o igual al nodo. El siguiente implementa algunos métodos de un árbol binario de búsqueda no balanceado.

]]>
]]>
Una clase plantilla que implementa un árbol binario de búsqueda no balanceado. Obtener código fuente.

Mapas (Arreglos asociativos, Hash o Diccionarios)

Un mapa, también llamado arreglo asociativo, hash o diccionario; es una estructura de datos que permite asociar una llave con un valor. Tanto las llaves como sus valores asociados pueden ser de cualquier tipo de datos. Por ejemplo, se puede asociar una palabra con su definición, o una palabra con su frecuencia de aparición en un texto, o un nivel de educación (un número) contra las personas que la han alcanzado (una lista enlazada de objetos), etc. El siguiente ejemplo muestra el contenedor std::map<Key, Value> de la Biblioteca Estándar de Plantillas (STL) de C++.

]]>
Ejemplo minimalista de implementación de un diccionario de definiciones. Obtener código fuente.

El siguiente ejemplo es un contador de palabras. Recibe una lista de nombres de archivo por parámetro. Cada palabra del archivo es cargada a un mapa (implementado como un árbol binario de búsqueda balanceado). Cada palabra es asociada con un entero largo, el cual indica la cantidad de veces que se ha encontrado la palabra en el archivo. El operador [] del mapa recibe una llave y retorna una referencia a su valor asociado. Cada vez que se encuentra una palabra, se incrementa su contador (con el operador ++). Finalmente el programa imprime cada una de las palabras y su conteo en la salida estándar.

]]>
Un eficiente contador de palabras únicas en archivos de texto. Obtener código fuente. Puede probar con el texto completo del Quijote de La Mancha.

Ejercicio. Modifique el ejemplo del contador de palabras únicas para que ignore caracteres especiales que se cargan al inicio o final de las palabras. Indague sobre los métodos de la clase std::string.

Ejercicio. Modifique el programa anterior, de tal forma que para cada palabra almacene las posiciones en el archivo donde la palabra aparece. Es decir, en su mapa cada palabra debe estar asociada con una lista enlazada de enteros (streampos). Indague sobre el método ifstream::tellg(). Su programa debe imprimir cada palabra única, la cantidad de veces que aparece en el archivo, y la lista de posiciones donde se encuentra.

Ejercicio. Modifique el contador de palabras únicas para que imprima las palabras en orden descendente de aparición. Sugerencia: cree otro mapa donde asocie la frecuencia de aparición con una lista de palabras. Recorra el mapa original para llenar el segundo. Luego imprima el segundo mapa de tal forma que las palabras más frecuentes aparezcan primero.