Está en la página 1de 32

Librerías Estandar de C++ (Standar Template Library o 

STL)

A continuación pondré algunas de las librerías de uso más común de C++ y


que forman parte de las librerías estandar de este lenguaje.

fstream:

Flujos hacia/desde ficheros. Permite la manipulación de archivos desde el


programar, tanto leer como escribir en ellos.

iosfwd:

Contiene declaraciones adelantadas de todas las plantillas de flujos y sus


typedefs estándar. Por ejemplo ostream.

iostream:

Parte del a STL que contiene los algoritmos estándar, es quizá la más usada e
importante (aunque no indispensable).

La biblioteca list:

Parte de la STL relativa a contenedores tipo list; listas doblemente enlazadas

math:

Contiene los prototipos de las funciones y otras definiciones para el uso y


manipulación de funciones matemáticas.

memory:

Utilidades relativas a la gestión de memoria, incluyendo asignadores y punteros


inteligentes (auto_ptr).

"auto_ptr" es una clase que conforma la librería memory y permite un fácil


manejo de punteros y su destrucción automaticamente.

Biblioteca new:

Manejo de memoria dinámica

numeric:

Parte de la librería numérica de la STL relativa a operaciones numéricas.

ostream:

Algoritmos estándar para los flujos de salida.

queue:

Parte de la STL relativa a contenedores tipo queue (colas de objetos).


Librería stdio:

Contiene los prototipos de las funciones, macros, y tipos para manipular datos
de entrada y salida.

Librería stdlib:

Contiene los prototipos de las funciones, macros, y tipos para utilidades de uso
general.

string:

Parte de la STL relativa a contenedores tipo string; una generalización de las


cadenas alfanuméricas para albergar cadenas de objetos. Muy útil para el fácil
uso de las cadenas de caracteres, pues elimina muchas d elas dificultades que
generan los char

typeinfo:

Mecanismo de identificación de tipos en tiempo de ejecución

vector:

Parte de la STL relativa a los contenedores tipo vector; una generalización de


las matrices unidimensionales C/C++

forward_list

Esta librería es útil para implementar con gran facilidad listas enlazadas
simples.

list

Permite implementar listas doblemente enlzadas (listas enlazadas dobles)


facilmente.

iterator

Proporciona un conjunto de clases para iterar elementos.

regex

Proporciona fácil acceso al uso de expresiones regulares para la comparación


de patrones.

thread

Útil para trabajar programación multihilos y crear múltiples hilos en nuestra


aplicación.
Nota: Para más información sobre las librerías estandar de C++ y STL puedes
ingresar aquí

¿Cómo declarar una librería en C++?

Veamos a continuación como se haría la declaración de unas cuantas librerías


conocidas, recuerda que ese pueden declarar todas las librerías necesarias y
siempre debe hacerse al comienzo del código fuente

#include "iostream"

#include "string"

#include <math.h>

#include <conio.h>

using namespace std;

Con esto debió quedar claro, como declarar librerías C++ al interior de un
código fuente. Lo único adicional, es la línea que dice using namespace
std; esta línea nos ayuda a declarar un espacio de nombre que evita tener que
usarlo cada que accedemos a alguna función especifica de una librería.
Teniendo este namespace declarado podemos llamar por ejemplo el comando
cout >>, que pertenece a la librería iostream, sin embargo sin este namespace
sería std::cout >>, imagina tener que hacer esto cada vez que uses algún
comando o función de las librerías, sería bastante tedioso.

Acerca del namespace std

Todas las librerías estándar de C++ contienen una declaración del espacio de
nombre std, es decir que todas las librerías que hacen parte del estándar de C+
+ colocan entidades dentro de este espacio de nombre.

Por esta razón cuando declaramos el uso del espacio de nombre std por medio
de "using namespace std;", podemos evitar estar escribiendo std::cout o
std::cin, etc en nuestro código.

El espacio de nombre std como tal no es una librería sino simplemente un


namespace, por esta razón no reemplaza la declaración de las librerías del
código, simplemente facilita la escritura de éste al momento de usar las
entidades de las librerías estándar. Sin embargo si vamos a hacer uso de una o
varias librerías estándar de C++ es recomendable que declaremos el
namespace std, para no tener que estar constantemente escribiendo cosas
similares a las que puse hace unas líneas como std::cin o similares, dado que
únicamente se puede acceder a la entidades de las librerías estándar por
medio del espacio nombre std.

Muy bien, ahora veamos algunos ejemplos simples del uso de librerías o
bibliotecas en C++

Ejemplo 1 de librerías en C++

En el siguiente ejemplo veremos el uso de la librería stdlib.h que posee una


gran variedad de funcionalidades, para este ejemplo usaremos la función rand
que nos permite generar un número aleatorio.

#include <stdlib.h>

#include <iostream>

using namespace std;

int main ()

cout << ("Se va a generar un numero aleatorio ....\n");

cout << ("El numero generado es : ");

cout << rand(); //Se genera el número con rand y se muestra en pantalla

return 0;

Aquí hemos mostrado un mensaje solicitando el nombre al usuario y luego


usando string, hemos creado un saludo que incluya el nombre del usuario.
"Hola Juan".

Ejemplo 3 para bibliotecas en C++

En este ejemplo usaremos la biblioteca vector, iterator y list, para crear un lista
doblemente enlazada, agregar algunos elementos en ella (incluido un vector) y
recorrerla.

#include <iostream>

#include <list>

#include <vector>

using namespace std;


int main ()

list<int> miLista; //Creamos

list<int>::iterator it;

for (int i=10; i<=50; i = i+10)

miLista.push_back(i);

//Se agrega un 10 20 30 40 50 a la lista

it = miLista.begin(); //Se estabelce el iterador al comienzo de la lista

it++; //Movemos el iterador una posición (ahora estamos en 20)

//Se inserta un 11 en la posición del 10 11 20 30 40 50

miLista.insert (it,11);

miLista.insert (it,3,18);

//En la actual posición del 20 insertamos un 18 tres veces

//10 11 18 18 18 20 30 40 50

//Creamos un vector que poseerá dos elementos con valor de 19

vector<int> myvector (2,19);


//Insertamos ese vector en la lista, enviando los iteradores del propio
vector

miLista.insert (it,myvector.begin(),myvector.end());

//10 11 18 18 18 19 19 20 30 40 50

cout << "Mi lista contiene lo siguiente:";

for (it=miLista.begin(); it!=miLista.end(); it++)

cout << ' ' << *it; //Se muestra el valor al cual está aùntando el
iterador

return 0;

El resultado final de la ejecución de este código debería mostrar por


pantalla "Mi lista contiene lo siguiente: 10 11 18 18 18 19 19 20 30 40 50" que
es el resultado final de la inserción.

Muy bien. He añadido este par de ejemplo a petición de algunos visitantes del
sitio y creo que sí eran muy necesarios, espero que con esto hayas clarificado
dudas y afianzado el concepto.

¡¡Bueno!!! Es todo lo que necesitas saber sobre librerías, al menos en la lista


que te he puesto, están las que vamos a usar para ejemplos y ejercicios y
algunas otras de mas. Si deseas información sobre alguna otra o que amplíe la
información sobre alguna que ya esta aquí, házmelo saber por medio de
la sección de comentarios

Ahora vamos a la siguiente sección y metamosle mano a algunos códigos y


cómo es su estructura. Venga!! da clic en el siguiente contenido
llamado Comentarios en C++.

LIBRERÍA DE C++
es una colección de clases y funciones , escritas en el núcleo del lenguaje. La
biblioteca estándar proporciona varios contenedores genéricos, funciones para
utilizar y manipular esos contenedores, funciones objeto, cadenas y flujos
genéricos

TIPOS DE LIBRERÍAS  DE C++

#include "stdio.h"

FUNCIONES

fclose Cierra un fichero a través de su puntero.

fopen, Abre un fichero para lectura, para escritura/reescritura o para


freopen, adición.
fdopen

remove Elimina un fichero.

rename Cambia al fichero de nombre.

rewind Coloca el indicador de posición de fichero para el stream apuntado


por stream al comienzo del   fichero.

tmpfile Crea y abre un fichero temporal que es borrado cuando cerramos


con la función fclose().

clearerr Despeja los indicadores de final de fichero y de posición de fichero


para el stream apuntado por stream al comienzo del fichero.

feof Comprueba el indicador de final de fichero.

ferror Comprueba el indicador de errores.


fflush Si stream apunta a un stream de salida o de actualización cuya
operación más reciente no era de entrada, la función fflush envía
cualquier dato aún sin escribir al entorno local o a ser escrito en el
fichero; si no, entonces el comportamiento no está definido. Si
stream es un puntero nulo, la función fflush realiza el despeje para
todos los streams cuyo comportamiento está descrito
anteriormente.

fgetpos Devuelve la posición actual del fichero.

fgetc Devuelve un carácter de un fichero.

fgets Consigue una cadena de caracteres de un fichero.

fputc Escribe un carácter en un fichero.

fputs Escribe una cadena de caracteres en un fichero.

ftell Devuelve la posición actual del fichero como número de bytes.

fseek Sitúa el puntero de un fichero en una posición aleatoria.

fsetpos Cambia la posición actual de un fichero.

fread lee diferentes tamaños de datos de un fichero.

fwrite Envía, desde el array apuntado por puntero, hasta nmemb de


elementos cuyo tamaño es especificado por tamaño. El indicador
de posición de ficheros es avanzado por el número de caracteres
escritos correctamente. Si existe un error, el valor resultante del
indicador de posición de ficheros es indeterminado.

getc Devuelve un carácter desde un fichero.

getchar Igual que getc.

gets Lee caracteres de entrada hasta que encuentra un salto de línea,


y los almacena en un único argumento.

printf, Usados para imprimir salidas de datos.


fprintf,
sprintf
snprintf

vprintf También utilizado para imprimir salidas.

perror Escribe un mensaje de error a stderr.

putc Devuelve un carácter de un fichero.


putchar, Igual que putc(stdout).
fputchar

scanf, Utilizado para introducir entradas.


fscanf,
sscanf

vfscanf, También utilizado para introducir entradas.


vscanf,
vsscanf

setbuf Esta función es equivalente a la función setvbuf pasando los


valores _IOFBF para modo y BUFSIZ para tamaño, o (si
acumulador es un puntero nulo), con el valor _IONBF para modo.

setvbuf Sólo puede ser usada después de que el stream apuntado por
stream ha sido asociado con un fichero abierto y antes de otra
operación cualquiera es llevada acabo al stream. El argumento
modo determina cómo stream será almacenado según lo
siguiente: _IOFBF ocasiona la entrada/salida a ser completamente
almacenado; _IOLBF ocasiona la entrada/salida a almacenar por
líneas; _IONBF ocasiona la entrada/salida a no ser almacenado.
Si acumulador no es un puntero nulo, el array al que es apuntado
puede ser usado en vez de la acumulación adjudicada por la
función setvbuf. El argumento tamaño especifica el tamaño del
array.

tmpnam Genera una cadena de caracteres que es un nombre válido para


ficheros y que no es igual al nombre de un fichero existente. La
función tmpnam genera una cadena diferente cada vez que es
llamada, hasta un máximo de TMP_MAX veces. Si la función es
llamada más veces que TMP_MAX, entonces el comportamiento
de la función está definido según la implementación del
compilador.

puts Imprime una de cadena de caracteres.

#include "stdlib.h"

atof (ascii to float) cadena de caracteres a coma flotante


atoi  cadena de caracteres a entero

atol (C Standard Library) (ascii cadena de caracteres a entero tamaño largo


to long)

strtod cadena de caracteres a coma flotante tamaño


doble

strtol  cadena de caracteres a entero largo

strtoul  cadena de caracteres a entero largo sin signo


(positivo)

rand Genera un número pseudo-aleatorio

srand Establece la semilla para el generador de


números pseudo-aleatorios

malloc, calloc, realloc Reservan memoria dinámica del heap

free Liberan memoria devolviéndola al heap

abort terminar ejecución anormalmente

atexit registrar una función callback callback para la


salida del programa

exit terminar ejecución del programa

getenv recuperar una variable de entorno

system ejecutar un comando externo

bsearch búsqueda binaria en un array

qsort ordena un vector usando quicksor

abs, labs valor absoluto

div, ldiv división entera o euclidiana

     #include <string.h>

memcpy copia n bytes entre dos áreas de memoria que no deben solaparse
memmov copia n bytes entre dos áreas de memoria; al contrario
e que memcpy las áreas deben solaparse

memchr busca un valor a partir de una dirección de memoria dada y


devuelve un puntero a la primera   ocurrencia del valor buscado o
null  si no se encuentra

memcmp compara los n primeros caracteres de dos áreas de memoria

memset sobre escribe un área de memoria con un patrón de bytes dado

strcat añade una cadena al final de otra

strncat añade los n primeros caracteres de una cadena al final de otra

strchr localiza un carácter en una cadena, buscando desde el principio

strrchr localiza un carácter en una cadena, buscando desde el final

strcmp compara dos cadenas alfabéticamente ('a'!='A')

strncmp compara los n primeros caracteres de dos cadenas


numéricamente ('a'!='A')

strcoll compara dos cadenas según la colación actual ('a'=='A')

strcpy copia una cadena en otra

strncpy copia los n primeros caracteres de una cadena en otra

strerror devuelve la cadena con el mensaje de error correspondiente al


número de error dado

strlen devuelve la longitud de una cadena

strspn devuelve la posición del primer carácter de una cadena que no


coincide con ninguno de los caracteres de otra cadena dada

strcspn devuelve la posición del primer carácter que coincide con alguno
de los caracteres de otra cadena dada

strpbrk encuentra la primera ocurrencia de alguno de los caracteres de


una cadena dada en otra

strstr busca una cadena dentro de otra

strtok parte una cadena en una secuencia de tokens

strxfrm transforma una cadena en su forma de colación (??)

strrev invierte una cadena


                                                        #include <ctype.h>

tolower: Convierte un carácter, en un parámetro entero ch, a minúscula.

toupper: Convierte un carácter, en un parámetro entero ch, a mayúscula

#include <locale.h>

localeconv: La función localeconv asigna los componentes de un objeto con


tipo struct lconv con valores apropiados para el

formateo de cantidades numéricas (monetarias y otras) según las reglas de la


localidad actual.

setlocale La función setlocale selecciona la porción apropiada de la localidad


del programa especificado por los argumentos

categoria y localidad. La función setlocale puede ser usada para cambiar o


preguntar la localidad actual total del

programa o porciones de ello.

#include <math.h>

acos arcocoseno

asien arcoseno

atan arcotangente

atan2 arcotangente de dos parámetros

ceil menor entero no menor que el parámetro

cos coseno

cosh coseno hiperbólico


exp(double función exponencial, computa ex
x)

abs valor absoluto

floor mayor entero no mayor que el parámetro

fmod residuo de la division de flotantes

frexp fracciona y eleva al cuadrado.

ldexp tamaño del exponente de un valor en punto flotante

log logaritmo natural

log10 logaritmo en base 10

modf obtiene un valor en punto flotante íntegro y en


partes

pow(x,y) eleva un valor dado a un exponente, xy

sin seno

sinh seno hiperbólico

sqrt raíz cuadrada

tan tangente

tanh tangente hiperbólica

#include <setjmp.h>

longjmp: Restaura el entorno guardado por la invocación más reciente de la


función setjmp en la misma

invocación del programa, con el argumento correspondiente entorno

setjmp: Guarda su entorno de llamadas en el argumento entorno para uso


posterior por la función longjmp
#include <signal.h>

raise: La función envía la señal señal al programa en ejecución.

signal:La función signal retorna el valor de func para la llamada más reciente a
signal para la señal especificada, señal, si la operación fue realizada con éxito

#include <time.h>

char * asctime(struct tm *) Recibe una variable de tipo puntero a estructura


tm (struct tm*) y devuelve una cadena de
caracteres

clock_t clock (void) Devuelve el número de pulsos de reloj desde que


se inició el proceso

char * ctime(time_t *) Recibe una variable de tipo puntero a time_t (time


t*) y devuelve una cadena con el mismo formato
que asctime()

double Recibe dos variables de tipo time_t, calcula su


difftime(time_t, time t) diferencia y devuelve el resultado (double)
expresado en segundos.

struct tm *gmtime(time_t *) Recibe un puntero a una variable de tiempo


(time_t*) y devuelve su conversion como
fecha/hora UTC a struct tm a través de un
puntero.

struct tm Similar funcionalidad a gmtime(), pero devuelve la


*localtime(time_t *) conversión como fecha/hora LOCAL.

time_t mktime(struct_tm *) Inversamente a gmtime() y localtime(),l recibe un


puntero a struct tm (struct tm*) y devuelve su
conversión al tipo time t.

time_t time(time_t *) Devuelve la fecha/hora (time_t) actual o -1 en


caso de no ser posible. Si el argumento que se le
pasa no es NULL, también asigna la fecha/hora
actual a dicho argumento.
size_t strftime(char Formatea la información pasada mediante la
*,size_t,char *,struct tm *) estructura (struct tm*) mediante el formato
indicado en una cadena (char*) e imprime el
resultado sobre otra cadena (char*) hasta un límite
de caracteres (size_t).

Otras librerias que no tienen funciones asociadas. Pero tienen macros


constantes y/o estructuras.

·         #include <assert.h>

·         #include <errno.h>

·         #include <float.h>

·         #include <limits.h>

·         #include <stdarg.h>

·         #include <stddef.h>

RESUMEN DE LIBRERIAS

Ø  assert.h Contiene una macro para el diagnóstico dentro de los programas.


Ø  ctype.h Contiene varias funciones para comprobación de tipos y transformación
de caracteres.
Ø  errno.h Contiene varias macros usadas para informar de errores.
Ø  limits.h Contienen varias macros que definen constantes para el tamaño de tipo
enteros.
Ø  float.h Contienen varias macros que definen constantes para el tamaño de tipo
flotante.
Ø  locale.h Contienen varias macros, funciones y tipos para unidades locales,
como unidad monetaria, tiempo, dígitos, etc.
Ø  math.h Contiene un macro y varias funciones matemáticas.
Ø  setjmp.h Contienen declaraciones que proporcionan una forma de evitar la
secuencia normal de llamada y regreso de funciones.
Ø  signal.h Contiene un tipo, dos funciones y varias macros para manejar
condiciones excepcionales que aparecen durante la ejecución, tal como una
señal de interrupción de una fuente externa o un error en la ejecución.
Ø  stdarg.h Contiene un tipo y tres macros que proporcionan recursos para
recorrer una lista de argumentos de función de tamaño y tipo desconocido.
Ø  stddef.h Contiene varios tipos y macros que también están definidas en otras
librerías, como size_t.
Ø  stdio.h Contiene tipos, macros y funciones para la realización de tareas de E/S.
Ø  stdlib.h Contiene tipos, macros y funciones para la conversión numérica,
generación de números aleatorios, búsquedas y ordenación, gestión de
memoria y tareas similares.
Ø  string.h Contiene tipos, macros y funciones para la manipulación de cadenas de
caracteres.
Ø  time.h Contiene tipos, macros y funciones para

5 Librería Estándar

§1  Sinopsis

C++ no llega al nivel de simplicidad de su antecesor C, pero al


igual que aquél, tampoco dispone de utilidades o funciones
para entrada o salida implementadas en el propio lenguaje, de
modo que estas y otras muchas, como manejo de cadenas de
caracteres (strings), manejo de ficheros, funciones matemáticas
Etc. son implementadas en forma delibrerías externas.

Una librería es un conjunto de recursos (algoritmos)


prefabricados, que pueden ser utilizados por el programador
para realizar determinadas operaciones (  1.4.4a). Las
declaraciones de las funciones (prototipos   4.4.1) utilizadas
en estas librerías, junto con algunas macros y constantes
predefinidas que facilitan su utilización, se agrupan en ficheros
de nombres conocidos que suelen encontrarse en sitios
predefinidos. Por ejemplo, en los sistemas UNIX, en 
/usr/include. Estos ficheros se suelen llamar "de cabecera",
porque es tradición utilizar las primeras líneas del programa
para poner las directivas #include (  4.9.10g) que los incluirá
en el fuente durante la fase de preprocesado (  1.4).

§2  Clases de librerías

Los compiladores C++ incluyen un amplio repertorio de clases,


funciones y macros que permiten realizar una amplia variedad
de tareas, incluyendo entradas/salidas de bajo y alto nivel;
manipulación de cadenas alfanuméricas y ficheros; control de
procesos (incluyendo multiproceso); manejo de memoria;
cálculos matemáticos y un largo etcétera.

Este repertorio de recursos es denominado colectivamente


como "Rutinas de librería"; "Librerías de
ejecución" RTL("Runtime Librarys") o simplemente "Librerías".  
Puede decirse que el lenguaje aislado (tal cual) no tiene
prácticamente ninguna utilidad sin la concurrencia de estas
utilidades. El Estándar C++ las clasifica según su utilidad:

 Soporte del lenguaje [7]

 Diagnóstico

 Utilidades generales

 Cadenas alfanuméricas ("Strings")

 Localización

 Contenedores

 Iteradores

 Algoritmos

 Cálculo numérico

 Entrada/Salida

§2.1  Librería Estándar C++

Para poner un poco de orden, el Estándar C++ define la


denominada Librería Estándar [3] que debe acompañar a
cada implementación del compilador que se adhiera al
estándar. Es decir: la norma determina cuales son, como se
llaman y como se utiliza este conjunto de algoritmos que deben
acompañar (como mínimo) a cada implementación del
compilador que quiera llamarse "Estándar". La última
versión, ISO/IEC 14882 del año 1998, especifica que se
compone de 32 ficheros de cabecera de nombres fijos y
conocidos agrupados según la funcionalidad de los algoritmos.
Son los siguientes: 

Ficheros Funcionalidad/funciones

<algorithm> Parte de la STL que describe los algoritmos (  


5.1.3)

<bitset> Parte de la STL relativa a contenedores


tipo bitset (  5.1.1e1). Set de valores booleanos.

<complex> Parte de la librería numérica de la STL relativa a


los complejos (  ).

<deque> Parte de la STL relativa a contenedores


tipo deque;  un tipo de colas: "Double-ended-
queue"  ( 5.1.1c3).

<exception> Parte de la librería de diagnóstico relativa al


manejo de excepciones (  1.6)

<fstream> Flujos hacia/desde ficheros.

<functional> Parte de la STL relativa a Objetos-función (  


4.9.18f)

<iomanip> Manipuladores.

<ios> Supreclases para manejo de flujos de E/S.

<iosfwd> Contiene declaraciones adelantadas de todas las


plantillas de flujos y sus typedefs estándar. Por
ejemplo ostream.

<iostream> Parte del a STL que contiene los algoritmos


estándar de E/S.

<istream> Algoritmos estándar de flujos de entrada.

<iterator> Parte de la STL relacionada con iteradores (  


5.1.2), un tipo de puntero que permite utilizar los
algoritmos de la Librería con las estructuras de
datos representadas por los contenedores.

<limits> Descripción de propiedades dependientes de la


implementación (  1.2.1) que afectan a los tipos
fundamentales.

<list> Parte de la STL relativa a contenedores tipo list (


 5.1.1c4);  listas doblemente enlazadas (  1.8)

<locale> Parte de la STL relativa a la internacionalización (


 5.2).

<map> Parte de la STL relativa a contenedores


tipo map (  5.1.1e4).

<memory> Utilidades relativas a la gestión de memoria,


incluyendo asignadores (  5.1.5) y punteros
inteligentes (auto_ptr).

<new> Manejo de memoria dinámica (  1.3.2)

<numeric> Parte de la librería numérica de la STL relativa a


operaciones numéricas (  ).

<ostream> Algoritmos estándar para los flujos de salida.

<queue> Parte de la STL relativa a contenedores


tipo queue (  5.1.1d1);  colas de objetos (  1.8).

<set> Parte de la STL relativa a contenedores tipo set (


 5.1.1e2).

<sstream> Flujos hacia/desde cadenas alfanuméricas.

<stack> Parte de la STL relativa a contenedores


tipo stack (  5.1.1c5);  pilas de objetos (  1.8).

<stdexcept> Parte de la STL relativa a las clases de las que


derivan los objetos lanzados por las excepciones
ocasionadas en los algoritmos de la propia STL y
otras expresiones.  Estas clases son utilizadas
para reportar errores detectados durante
runtime.  Los usuarios también pueden utilizar
excepciones para reportar errores en sus propios
programas (  1.6.1a).

<streambuf> Parte de la STL relativa al Almacenamiento de


flujos de E/S ("Stream buffers").  Define los tipos
que controlan la capa de transporte (  5.3.2f).

<string> Parte de la STL relativa a contenedores


tipo string (  );  una generalización de las
cadenas alfanuméricas para albergar cadenas de
objetos.

<typeinfo> Mecanismo de identificación de tipos en tiempo


de ejecución (  4.9.14).

<utility> Parte de la STL que contiene elementos


auxiliares como operadores y pares (pairs).

<valarray> Parte de la librería numérica de la STL relativa a


manejo de matrices numéricas ()

<vector> Parte de la STL relativa a los contenedores


tipo vector; una generalización de las matrices
unidimensionales C/C++ (  5.1.1c1)

Es digno de mención que aunque generalmente las librerías no


aportan ninguna característica al lenguaje (se supone que son
utilidades auxiliares que no forman parte del lenguaje
propiamente dicho), una pequeña porción de la Librería
Estándar C++ sí aporta características que se consideran
pertenecientes a este, de forma que deben estar presentes los
ficheros de cabecera correspondientes si se desea usarlas. En
concreto se refieren a los siguientes elementos:

 Operadores new, new[], delete y delete[] (  4.9.20).

 Clase type_info que corresponde al mecanismo RTTI de


identificación de tipos en tiempo de ejecución
representado por el operador typeid (  4.9.14).
 Rutinas de inicio y terminación (  1.5).

 Las excepciones estándar lanzadas por los algoritmos


anteriores (  1.6.1a)

§2.2  Librería C

Además de otras nuevas, cuyo diseño e importancia cambian


drásticamente la filosofía del lenguaje, C++ incluye
prácticamente la totalidad de funciones de la primitiva librería
estándar C. A esta librería, mantenida por compatibilidad, la
denominamos Librería clásica (  5.5).

§2.3 Otras librerías

Además de las que proporciona el Estándar y las


complementarias que pueda incluir por su cuenta el fabricante
del compilador, en los proyectos reales se suelen utilizar
infinidad de otras librerías, comerciales o públicas, que facilitan
el trabajo en áreas particulares, y en este sentido, recordar que
uno de los pecados que el programador novel debe evitar, es la
tendencia a querer reinventar constantemente la rueda. De
forma que el consejo es utilizar en lo posible librerías que estén
probadas y sean fácilmente accesibles. Aunque hay que tener
cuidado, porque determinados proyectos exigen que las
librerías utilizadas estén perfectamente documentadas y en
ciertos casos, que se cuente con los fuentes correspondientes.

Aunque el mundo del software se mueve muy rápidamente y


cualquier indicación al respecto puede quedar rápidamente
anticuada, en la página Librerías C/C++ de este manual puede
encontrar una selección de ellas. Aquí nos limitaremos a hacer
especial mención a las Librerías Boost, por su condición de
libres y su alta calidad técnica. Algunas de ellas han sido
adoptadas por la última versión del Estándar (C++11) [8]. 

§3 Componentes

Al referirnos a las librerías C++ utilizamos la terminología


siguiente:
 RTL  Conjunto de librerías que acompañan a un
compilador ("Runtime Library"), sean o no estándar.

 Librería Estándar. Conjunto de librerías cuyo contenido


está definido por el Estándar C++ (abreviadamente LE)

 Libería clásica. Parte de la Librería Estándar


correspondiente al C clásico.

 STL ("Standard Templete Library"). Parte de


la LE genuina de C++ (que no es heredada de C) y que
responde a la forma "++" de hacer las cosas.

La calidad de un compilador C++ viene determinada en gran


medida por la calidad y cantidad de su RTL; por su grado de
adherencia al Estándar [6] y por el grado de soporte que
proporciona para la plataforma concreta a que se destina.

Nota: en lo que concierne a la programación para MS


Windows (las referencias a la plataforma Wintel surgen de
forma constante e inevitable), los compiladores Borland C++
y MS Visual C++ son quizás los más conocidos y utilizados. 
El primero incluye una completa librería
denominada VCL (Visual Component Library   4.11.8b). La
del segundo es conocida como MFC (Microsoft Foundation
Classes   1.7.2).

Linux dispone de su propio compilador: GNU Cpp, que


comenzó siendo un compilador C y ha evolucionado a un
producto que es en realidad un superconjunto de
compiladores. No solo puede compilar código C y C++; 
también otros lenguajes como Ada o Fortran;  de forma que
es común referirse a ellos como GCC ("GNU Compiler
Collection").  La buena noticia es que existen versiones de
este compilador para plataformas Windows, de forma que
incluso en este ambiente "Propietario" pueden realizarse
desarrollos utilizando herramientas "Open source" (ver
recuadro en   1.4.0a1).
A grandes rasgos la librería Estándar C++ comprende los
siguientes módulos:

 La denominada Librería Estándar de Plantillas (  5.1),


abreviadamente STL ("Standard Templete Library").

o Librería numérica. Parte de la STL que contiene


algoritmos especialmente concebidos para
computación numérica. Por ejemplo, una
clase valarray optimizada para matrices numéricas
y una clase complex para manejo y representación
estandarizada de números complejos (en realidad
una plantilla con especializaciones para los
tipos float, double y long double).

o Utilidades. Parte de la STL dedicada a elementos


auxiliares tales como adaptadores y la
clase auto_ptr.

 Unas utilidades de entrada/salida de flujos, denominadas


genéricamente iostreams (  5.3).

 Una utilidad locale para manejo de localismos [4] (  5.2).

 Una clase string para manejo estandarizado de cadenas


de caracteres.  En realidad es una instanciación
(especialización) de la plantilla basic_string para
cadenas de caracteres. 

 Un esquema para describir de modo uniforme el entorno


de ejecución mediante la utilización de una clase estándar
denominada numeric_limits y especialización para cada
uno de los tipos de datos fundamentales.

 Utilidades para manejo de memoria (  5.1.5).

 Soporte para utilización de juegos de caracteres y signos


de diversos idiomas.
 Utilidades de diagnóstico y manejo de errores. Incluyen
manejo de excepciones (  1.6) y la macro assert (
1.4.5).

§4 Funcionalidad

Si atendemos a su funcionalidad,  las utilidades ofrecidas por la


Librería Estándar pueden agruparse en:

 Clasificación: Clasifican caracteres ASCII, como letras,


caracteres de control (no imprimibles),
Mayúsculas/minúsculas etc. Se definen en la cabecera
<ctype.h>.

 Entradas/Salidas de Consola: Estas son las


denominadas entrada/salida estándar. Por defecto se
refieren al teclado y a la pantalla (no pueden utilizarse
directamente en aplicaciones de interfaz gráfica).

 Conversión: Convierten caracteres y cadenas de


caracteres desde formato alfabético a numérico de
diversos tipos (float, int, long).  También realizan la
conversión inversa: de formatos numéricos a
representaciones alfabéticas y de mayúsculas a
minúsculas y viceversa.

 Diagnóstico: Son rutinas destinadas a comprobaciones;


a descubrir y corregir posibles errores.

 Directorio: Rutinas para manejo de directorios y sus


direcciones (path names).

 En linea (Inline): Rutinas para versiones inline de


funciones. El compilador genera el código
correspondiente para las versiones inline cuando se
utiliza #pragma intrinsic o si se solicita optimización al
compilador (optimización de tiempo de ejecución).

 Entrada/Salida. Son rutinas que proporcionan manejo de


flujos y operaciones de Entrada/Salida a bajo nivel (de
Sistema Operativo).
 Manipulación. Manejo de cadenas y bloques de
memoria: copiar, comparar, convertir y buscar.

 Matemáticas: Para realizar cálculos matemáticos.

 De Memoria: Proporcionan asignación de memoria


dinámica.

 Miscelánea. Se agrupan aquí rutinas varias, como las


que posibilitan saltos (goto) no locales y las que manejan
diferencias de tipo cultural o de lenguaje. Por ejemplo
representación de números, de moneda, formatos de
fecha y hora, clasificación de tipo alfabético, etc.

 Control de proceso. Rutinas que permiten invocar y


terminar nuevos procesos desde otra rutina.

 Fecha y hora. Incluyen rutinas para conversión y


manipulación de variables de medida del tiempo (fecha y
hora).

 Argumentos variables. Rutinas utilizadas cuando se


usan listas variables de argumentos, como en los casos
deprintf(), vscanf(), etc.

§5  Utilización

La utilización de la Librería Estándar C++ requiere de dos tipos


de condiciones que podríamos describir como formales y
conceptuales.

§5.1  En cuanto a las primeras (condiciones formales) y habida


cuenta que las utilidades aparecen en forma de funciones,
resulta evidente que su utilización exige incluirlas en nuestro
programa. Para ello se necesitan tres pasos (en realidad las
exigencias son las mismas que con cualquier otra función, la
diferencia estriba en la forma en que se realizan los
pasos by c):
  a:  Incluir en el código fuente las invocaciones a las
funciones que estamos utilizando. Ejemplo:
printf("Esto es una llamada a la
función \"printf\" de librería\n");

  b:  Incluir en el código fuente los prototipos de dichas


funciones.

Puesto que los prototipos ya están incluidos en los ficheros


estándar de cabecera, hay que indicar al compilador que los
incluya [2]. Esto se realiza poniendo en nuestro fuente
(normalmente al principio) una directiva de
preprocesado #include(  4.9.10g) que señala el fichero de
cabecera que se debe añadir. Por ejemplo, si el manual indica
que la función printfestá definida en el fichero de
cabecera stdio.h ponemos en nuestro código:
#include <stdio.h>

  c:  Incluir en el fuente las definiciones de las funciones


utilizadas. Como alternativa se puede indicar al compilador que
tales definiciones están en ficheros compilados previamente.

En este último caso se dice que las definiciones de las


funciones están en librerías (  1.4) de las que existen dos
tipos:estáticas (.LIB, .OBJ y .BPI) y dinámicas (.DLL). Toda la
información que necesita el compilador está contenida en los
ficheros de cabecera, por lo que las operaciones
correspondientes son realizadas de forma automática; con la
sola condición de que los ficheros y librerías correspondientes
sean accesibles al enlazador.

  No olvidar que la entidades de la Librería Estándar C++


(que no están en ficheros de cabecera .h), se han definido en
un espacio de nombres denominado std, por lo que es preciso
referirse a él específicamente cuando se quieran utilizar estos
recursos (  4.1.11c2).

§5.2  Respecto a las que hemos denominado "condiciones


conceptuales", damos por sentado que la utilización de
algoritmos de la Librería exige conocerlos. Pero debemos
advertir que existe una gran diferencia entre las rutinas de la
que hemos denominado librería clásica y los recursos de la
nueva Librería Estándar de Plantillas STL.

§5.2a  En general los algoritmos contenidos en la librería


clásica realizan tareas muy sencillas bajo la forma de funciones
que, con un cierto número de argumentos, realizan la tarea
encomendada. A veces devolviendo un objeto (que puede ser
una estructura). Su utilización exige poco más que repasar esta
colección de funciones (209 en la última versión del Estándar)
hasta encontrar la que mejor se ajusta a nuestras necesidades.
Para esto lo mejor es recurrir a la clasificación temática ofrecida
en la documentación que acompaña a los compiladores antes
que a la lista alfabética de las mismas. A continuación
estudiamos atentamente su prototipo y la explicación de
funcionamiento que acompaña el manual (eventualmente
incluso con un ejemplo) y ya estamos listos para utilizarla. En el
peor de los casos suelen bastar un par de pruebas hasta que
conseguimos ajustar los argumentos de forma que se consiga
el resultado esperado.

Nota: a título de ejemplo, el fichero BCB5RTL.HLP, que


contiene la "C Runtime Library reference" (nombre con que
aparece la Librería Clásica en la documentación de
Borland), contiene dos secciones; la primera, denominada
"Categorical Routines and Types Listing", contiene la
clasificación temática; la segunda, denominada
"Alphabetical Routines and Types Listing", contiene la
relación alfabética [5].

Como última recomendación al respecto, sobre todo si


pensamos que nuestro programa tendrá una larga vida y/o
pensamos portarlo a otras plataformas, aconsejaría echar un
vistazo a la sección de "compatibilidad" que acompaña a la
descripción de cada función en la documentación de la mayoría
de compiladores. Suele ocurrir que el compilador ofrezca
muchas más funciones que las estrictamente Estándar C++, y
que estas no estén claramente separadas del resto, de forma
que es posible que elijamos una función que resuelve nuestro
problema pero no es portable, en cuyo caso aconsejaría
evitarlas dentro de lo posible.

Nota: como ejemplo escogido al azar,  la función max(), que


aparece en primer lugar en la clasificación temática de la
documentación Borland C (Runtime Library reference:
"Categorical Routines and Types Listing"), es una función
ofrecida por este compilador para el entorno Windows-32
pero no es portable a UNIX ni tampoco pertenece a los
estándares C o C++.

§5.2b  Para todo el que no se haya asomado antes a la


programación genérica, la utilización de la nueva Librería de
Plantillas (STL) exige la asimilación de un nuevo paradigma; 
una nueva forma de pensar que, si se tiene experiencia en
programación tradicional, exige incluso un "cambio de chip", ya
que estas herramientas conforman un mundo enteramente
nuevo y singular.

Con independencia de las explicaciones más detalladas que


incluimos en el siguiente capítulo (  5.1), adelantemos aquí
que la STL ofrece un conjunto de recursos flexible, potente y
altamente optimizado para resolver una gran variedad de
situaciones de programación. Pero esta versatilidad y potencia
tributan un precio: su alto grado de parametrización supone
algo más que utilizar herramientas aisladas. Es necesario saber
ensamblar entre sí los recursos disponibles, que no trabajan
aisladamente y que son básicamente de tres
tipos: contenedores, iteradores y algoritmos. El resultado es
que el proceso de utilizar la STL es algo más complicado que la
simple búsqueda de una función que resuelva nuestras
necesidades;  que la curva de aprendizaje es ciertamente más
ardua que en el caso de la librería clásica, y  que los conceptos
involucrados son más abstractos y requieren un conocimiento
más extenso de sus fundamentos para utilizarlos. Desde luego,
la descripción detallada de todos sus elementos exige un libro
completo, y de hecho son muchos los que se han publicado
con el objeto exclusivo de describir la STL y/o sus técnicas de
uso. En compensación, las contrapartidas obtenidas justifican
sin duda el esfuerzo. El programador puede concentrarse más
en el problema que en los detalles de su implementación en el
fuente, se incremente la productividad y se gana en claridad
conceptual.

§6  Funciones y macros

Hay que señalar que algunas funciones pueden venir


implementadas de dos formas: como macro y como función.
Por ejemplo, la función isalnum, contenida en <ctype.h>.  Esto
significa que además de estar implementada como una función
en la correspondiente librería (que se utiliza con los
argumentos señalados en el manual), está definida como una
macro de preprocesado en <ctype.h>, de forma que salvo
indicación contraria al compilador, el preprocesador transforma
la llamada del programador en otra serie de sentencias
equivalentes que utilizan los mismos argumentos. El resultado
es que en el código resultante, que luego pasa al compilador y
al enlazador, no existe nada parecido a una llamada a una
función isalnum (técnicamente el proceso es una
sustitución inline de la función de librería,   4.4.6b).

Para evitar que esto ocurra y por consiguiente que la llamada


a islanum nunca llegue a producirse, basta con indefinir la
correspondiente directiva. Esto se hace incluyendo al principio
del código, y debajo de la línea #include <ctype.h>, una línea de
preprocesado adecuada, en este caso:  #undef isalnum, con lo
que el #define del preprocesador quedará sin efecto, con el
resultado de que todas las invocaciones a isalnum de nuestro
código serán respetadas por el preprocesador. Más tarde el
enlazador cargará el código de isalnum (que extrae de la
librería) con el resto de nuestro programa, y colocará en cada
punto de nuestro código donde aparezca una invocación
a isalnum, un salto a la dirección adecuada.

En estos casos, el resultado es el mismo en ambas


modalidades: como macro (por defecto) o como función de
librería. La elección de una u otra es cuestión de optimización.
Para tomar una decisión es necesario comprobar y valorar dos
aspectos:

 El tamaño del ejecutable que resulta en uno y otro caso.


Posiblemente mayor si se utiliza la función muchas veces
y se adopta la macro.

 La velocidad de ejecución. Posiblemente mayor si se


utiliza la función muchas veces (en bucles muy largos) y
se utiliza la macro [1].

  Inicio.

[1]  El cronometraje se puede realizar sencillamente a mano,


con un cronómetro, o colocando marcadores en sitios
estratégicos del programa que, utilizando el reloj del sistema,
muestren los tiempos consumidos. Ver ejemplo (  9.1).

[2]  Estrictamente hablando estas operaciones son realizadas


por el preprocesador, el analizador sintáctico,
elcompilador o el enlazador según los casos. Nos referimos a
todos estos módulos como "compilador" en un sentido
genérico, pues desde un punto de vista práctico, en algunos
casos (como el copilador C++Builder de Borland), solo hay que
realizar una llamada al "compilador" y este se encarga de la
totalidad del proceso (  1.4.0).

[3]  En lo sucesivo la designaremos así, con mayúsculas


iniciales, para simbolizar que es una librería única y
perfectamente especificada.

[4]  "Locales" son conjuntos de datos que indican preferencias


culturales. Por ejemplo: formas de representar la hora, las
fechas, el "punto" decimal, etc. La utilidad locale de la Librería
Estándar es la forma que tiene C++ de dar soporte a la
internacionalización de los programas.

[5]  Aconsejo descargar la documentación C++ del "Site" de


Borland aunque se trabaje con otro compilador. Además de
gratuita, es muy completa, bien estructurada y con abundantes
ejemplos.

[6]  Posiblemente esta afirmación puede resultarle


sorprendente a más de uno.  En informática y en muchos
aspectos de la vida, las leyes y normas suelen ir muy por
detrás de mundo y la vida cotidianos. Es frecuente que las
estandarizaciones y normativas se limiten a consagrar
"oficialmente" hábitos y costumbres largamente consagrados
ya por la práctica. Sin embargo, en el caso del C++ los
acontecimientos se han sucedido a veces de forma contraria.
En el Comité de Estandarización participan representantes de
la industria (del software) junto con miembros de laboratorios
de investigación y desarrollo. Teóricos de los lenguajes;
estudiosos de las teorías de computación, de compiladores,
Etc. que han tenido tanto o más peso que aquellos. El
resultado es que en algunos casos el Estándar a introducido y
aprobado herramientas que no estaban suficientemente
probadas o generalizadas en la práctica. Construcciones
teóricas que ni siguiera eran soportadas por la mayoría de
compiladores disponibles comercialmente. Esto, que incluso ha
originado comentarios negativos por parte de algunos
miembros del Comité, ha motivado que incluso algún tiempo
después de publicado el Estándar, muchos compiladores no
hubiesen implementado aún todas sus características.

[7]  Este primer grupo constituye un caso especial: En principio


una librería es algo que ayuda a realizar determinadas
operaciones con más facilidad que la ofrecida por los métodos
implementados en el lenguaje, o que permite hacer algo que no
puede hacerse con las herramientas definidas en él, pero que
en rigor no forma parte del lenguaje en sí mismo. Sin embargo
C++ ha sido dotado de ciertas extensiones que se han incluido
en forma de librerías (denominadas "de soporte"   1.5.2). De
forma que en cierto sentido dichas librerías sí forman parte del
lenguaje.

[8]  Si quiere una perspectiva de a la evolución de la Librería


Estándar y del estado actual (2013) de la cuestión respecto su
uso, versus librerías externas, puede interesarle el artículo (en
Inglés) de Jeff Cogswell "Comparing the C++ Standard and
Boost".

También podría gustarte