You are on page 1of 21

5 Librera Estndar

1 Sinopsis

C++ no llega al nivel de simplicidad de su antecesor C, pero al igual que aqul, 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 matemticas Etc. son implementadas en forma de libreras externas.

Una librera 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 libreras, junto con algunas macros y
constantes predefinidas que facilitan su utilizacin, 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 tradicin utilizar las
primeras lneas 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 libreras

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; manipulacin de cadenas alfanumricas y ficheros; control de procesos (incluyendo
multiproceso); manejo de memoria; clculos matemticos y un largo etctera.

Este repertorio de recursos es denominado colectivamente como "Rutinas de librera";


"Libreras de ejecucin" RTL ("Runtime Librarys") o simplemente "Libreras". Puede decirse
que el lenguaje aislado (tal cual) no tiene prcticamente ninguna utilidad sin la concurrencia de
estas utilidades. El Estndar C++ las clasifica segn su utilidad:

Soporte del lenguaje [7]


Diagnstico
Utilidades generales
Cadenas alfanumricas ("Strings")
Localizacin
Contenedores
Iteradores
Algoritmos
Clculo numrico
Entrada/Salida

2.1 Librera Estndar C++

Para poner un poco de orden, el Estndar C++ define la denominada Librera Estndar [3] que
debe acompaar a cada implementacin del compilador que se adhiera al estndar. Es decir: la
norma determina cuales son, como se llaman y como se utiliza este conjunto de algoritmos que
deben acompaar (como mnimo) a cada implementacin del compilador que quiera llamarse
"Estndar". La ltima versin, ISO/IEC 14882 del ao 1998, especifica que se compone de 32
ficheros de cabecera de nombres fijos y conocidos agrupados segn 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 librera numrica 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 librera de diagnstico relativa al manejo de excepciones (
1.6)
<fstream> Flujos hacia/desde ficheros.
<functional> Parte de la STL relativa a Objetos-funcin ( 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 estndar. Por ejemplo ostream.
<iostream> Parte del a STL que contiene los algoritmos estndar de E/S.
<istream> Algoritmos estndar 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 Librera con las estructuras de
datos representadas por los contenedores.
<limits> Descripcin de propiedades dependientes de la implementacin (
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 internacionalizacin ( 5.2).
<map> Parte de la STL relativa a contenedores tipo map ( 5.1.1e4).
<memory> Utilidades relativas a la gestin de memoria, incluyendo asignadores (
5.1.5) y punteros inteligentes (auto_ptr).
<new> Manejo de memoria dinmica ( 1.3.2)
<numeric> Parte de la librera numrica de la STL relativa a operaciones numricas
( ).
<ostream> Algoritmos estndar 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 alfanumricas.
<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 tambin 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
generalizacin de las cadenas alfanumricas para albergar cadenas de
objetos.
<typeinfo> Mecanismo de identificacin de tipos en tiempo de ejecucin (
4.9.14).
<utility> Parte de la STL que contiene elementos auxiliares como operadores y
pares (pairs).
<valarray> Parte de la librera numrica de la STL relativa a manejo de matrices
numricas ()
<vector> Parte de la STL relativa a los contenedores tipo vector; una
generalizacin de las matrices unidimensionales C/C++ ( 5.1.1c1)

Es digno de mencin que aunque generalmente las libreras no aportan ninguna caracterstica
al lenguaje (se supone que son utilidades auxiliares que no forman parte del lenguaje
propiamente dicho), una pequea porcin de la Librera Estndar C++ s aporta caractersticas
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 identificacin de tipos en
tiempo de ejecucin representado por el operador typeid ( 4.9.14).
Rutinas de inicio y terminacin ( 1.5).
Las excepciones estndar lanzadas por los algoritmos anteriores ( 1.6.1a)

2.2 Librera C

Adems de otras nuevas, cuyo diseo e importancia cambian drsticamente la filosofa del
lenguaje, C++ incluye prcticamente la totalidad de funciones de la primitiva librera estndar C.
A esta librera, mantenida por compatibilidad, la denominamos Librera clsica ( 5.5).

2.3 Otras libreras

Adems de las que proporciona el Estndar y las complementarias que pueda incluir por su
cuenta el fabricante del compilador, en los proyectos reales se suelen utilizar infinidad de otras
libreras, comerciales o pblicas, 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 libreras que estn probadas y sean fcilmente accesibles. Aunque hay que tener
cuidado, porque determinados proyectos exigen que las libreras utilizadas estn
perfectamente documentadas y en ciertos casos, que se cuente con los fuentes
correspondientes.

Aunque el mundo del software se mueve muy rpidamente y cualquier indicacin al respecto
puede quedar rpidamente anticuada, en la pgina Libreras C/C++ de este manual puede
encontrar una seleccin de ellas. Aqu nos limitaremos a hacer especial mencin a las Libreras
Boost, por su condicin de libres y su alta calidad tcnica. Algunas de ellas han sido adoptadas
por la ltima versin del Estndar (C++11) [8].

3 Componentes

Al referirnos a las libreras C++ utilizamos la terminologa siguiente:

RTL Conjunto de libreras que acompaan a un compilador ("Runtime Library"), sean o


no estndar.
Librera Estndar. Conjunto de libreras cuyo contenido est definido por el Estndar
C++ (abreviadamente LE)
Libera clsica. Parte de la Librera Estndar correspondiente al C clsico.
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 Estndar [6] y por el grado de soporte que
proporciona para la plataforma concreta a que se destina.

Nota: en lo que concierne a la programacin para MS Windows (las referencias a la


plataforma Wintel surgen de forma constante e inevitable), los compiladores Borland C++ y
MS Visual C++ son quizs los ms conocidos y utilizados. El primero incluye una completa
librera 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 cdigo C y C++; tambin otros lenguajes como Ada o Fortran; de
forma que es comn 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 librera Estndar C++ comprende los siguientes mdulos:

La denominada Librera Estndar de Plantillas ( 5.1),


abreviadamente STL ("Standard Templete Library").
o Librera numrica. Parte de la STL que contiene algoritmos especialmente
concebidos para computacin numrica. Por ejemplo, una
clase valarray optimizada para matrices numricas y una clase complex para
manejo y representacin estandarizada de nmeros complejos (en realidad
una plantilla con especializaciones para los tiposfloat, 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 genricamente 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 instanciacin (especializacin) de la plantilla basic_string para cadenas de
caracteres.
Un esquema para describir de modo uniforme el entorno de ejecucin mediante la
utilizacin de una clase estndar denominada numeric_limits y especializacin para
cada uno de los tipos de datos fundamentales.
Utilidades para manejo de memoria ( 5.1.5).
Soporte para utilizacin de juegos de caracteres y signos de diversos idiomas.
Utilidades de diagnstico 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 Librera Estndar pueden


agruparse en:

Clasificacin: Clasifican caracteres ASCII, como letras, caracteres de control (no


imprimibles), Maysculas/minsculas etc. Se definen en la cabecera <ctype.h>.
Entradas/Salidas de Consola: Estas son las denominadas entrada/salida estndar.
Por defecto se refieren al teclado y a la pantalla (no pueden utilizarse directamente en
aplicaciones de interfaz grfica).
Conversin: Convierten caracteres y cadenas de caracteres desde formato alfabtico
a numrico de diversos tipos (float,int, long). Tambin realizan la conversin inversa:
de formatos numricos a representaciones alfabticas y de maysculas a minsculas y
viceversa.
Diagnstico: 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
cdigo correspondiente para las versiones inline cuando se utiliza #pragma intrinsic o
si se solicita optimizacin al compilador (optimizacin de tiempo de ejecucin).
Entrada/Salida. Son rutinas que proporcionan manejo de flujos y operaciones de
Entrada/Salida a bajo nivel (de Sistema Operativo).
Manipulacin. Manejo de cadenas y bloques de memoria: copiar, comparar, convertir
y buscar.
Matemticas: Para realizar clculos matemticos.
De Memoria: Proporcionan asignacin de memoria dinmica.
Miscelnea. 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
representacin de nmeros, de moneda, formatos de fecha y hora, clasificacin de tipo
alfabtico, etc.
Control de proceso. Rutinas que permiten invocar y terminar nuevos procesos desde
otra rutina.
Fecha y hora. Incluyen rutinas para conversin y manipulacin de variables de medida
del tiempo (fecha y hora).
Argumentos variables. Rutinas utilizadas cuando se usan listas variables de
argumentos, como en los casos de printf(),vscanf(), etc.

5 Utilizacin
La utilizacin de la Librera Estndar C++ requiere de dos tipos de condiciones que podramos
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 utilizacin exige incluirlas en nuestro
programa. Para ello se necesitan tres pasos (en realidad las exigencias son las mismas que
con cualquier otra funcin, la diferencia estriba en la forma en que se realizan los pasos b y c):

a: Incluir en el cdigo fuente las invocaciones a las funciones que estamos utilizando.
Ejemplo:

printf("Esto es una llamada a la funcin \"printf\" de librera\n");

b: Incluir en el cdigo fuente los prototipos de dichas funciones.

Puesto que los prototipos ya estn incluidos en los ficheros estndar 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 seala el
fichero de cabecera que se debe aadir. Por ejemplo, si el manual indica que la
funcin printf est definida en el fichero de cabecera stdio.h ponemos en nuestro cdigo:

#include <stdio.h>

c: Incluir en el fuente las definiciones de las funciones utilizadas. Como alternativa se


puede indicar al compilador que tales definiciones estn en ficheros compilados previamente.

En este ltimo caso se dice que las definiciones de las funciones estn en libreras ( 1.4) de
las que existen dos tipos:estticas (.LIB, .OBJ y .BPI) y dinmicas (.DLL). Toda la informacin
que necesita el compilador est contenida en los ficheros de cabecera, por lo que las
operaciones correspondientes son realizadas de forma automtica; con la sola condicin de
que los ficheros y libreras correspondientes sean accesibles al enlazador.

No olvidar que la entidades de la Librera Estndar C++ (que no estn en ficheros de


cabecera .h), se han definido en un espacio de nombres denominado std, por lo que es preciso
referirse a l especficamente cuando se quieran utilizar estos recursos ( 4.1.11c2).

5.2 Respecto a las que hemos denominado "condiciones conceptuales", damos por sentado
que la utilizacin de algoritmos de la Librera exige conocerlos. Pero debemos advertir que
existe una gran diferencia entre las rutinas de la que hemos denominadolibrera clsica y los
recursos de la nueva Librera Estndar de Plantillas STL.

5.2a En general los algoritmos contenidos en la librera clsica realizan tareas muy sencillas
bajo la forma de funciones que, con un cierto nmero de argumentos, realizan la tarea
encomendada. A veces devolviendo un objeto (que puede ser una estructura). Su utilizacin
exige poco ms que repasar esta coleccin de funciones (209 en la ltima versin del
Estndar) hasta encontrar la que mejor se ajusta a nuestras necesidades. Para esto lo mejor es
recurrir a la clasificacin temtica ofrecida en la documentacin que acompaa a los
compiladores antes que a la lista alfabtica de las mismas. A continuacin estudiamos
atentamente su prototipo y la explicacin de funcionamiento que acompaa 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 ttulo de ejemplo, el fichero BCB5RTL.HLP, que contiene la "C Runtime Library
reference" (nombre con que aparece la Librera Clsica en la documentacin de Borland),
contiene dos secciones; la primera, denominada "Categorical Routines and Types Listing",
contiene la clasificacin temtica; la segunda, denominada "Alphabetical Routines and
Types Listing", contiene la relacin alfabtica [5].

Como ltima recomendacin al respecto, sobre todo si pensamos que nuestro programa tendr
una larga vida y/o pensamos portarlo a otras plataformas, aconsejara echar un vistazo a la
seccin de "compatibilidad" que acompaa a la descripcin de cada funcin en la
documentacin de la mayora de compiladores. Suele ocurrir que el compilador ofrezca muchas
ms funciones que las estrictamente Estndar C++, y que estas no estn claramente
separadas del resto, de forma que es posible que elijamos una funcin que resuelve nuestro
problema pero no es portable, en cuyo caso aconsejara evitarlas dentro de lo posible.

Nota: como ejemplo escogido al azar, la funcin max(), que aparece en primer lugar en la
clasificacin temtica de la documentacin Borland C (Runtime Library reference:
"Categorical Routines and Types Listing"), es una funcin ofrecida por este compilador
para el entorno Windows-32 pero no es portable a UNIX ni tampoco pertenece a los
estndares C o C++.

5.2b Para todo el que no se haya asomado antes a la programacin genrica, la utilizacin
de la nueva Librera de Plantillas (STL) exige la asimilacin de un nuevo paradigma; una
nueva forma de pensar que, si se tiene experiencia en programacin tradicional, exige incluso
un "cambio de chip", ya que estas herramientas conforman un mundo enteramente nuevo y
singular.

Con independencia de las explicaciones ms detalladas que incluimos en el siguiente captulo (


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 programacin. Pero
esta versatilidad y potencia tributan un precio: su alto grado de parametrizacin supone algo
ms que utilizar herramientas aisladas. Es necesario saber ensamblar entre s los recursos
disponibles, que no trabajan aisladamente y que son bsicamente de tres
tipos: contenedores, iteradores y algoritmos. El resultado es que el proceso de utilizar la STL
es algo ms complicado que la simple bsqueda de una funcin que resuelva nuestras
necesidades; que la curva de aprendizaje es ciertamente ms ardua que en el caso de la
librera clsica, y que los conceptos involucrados son ms abstractos y requieren un
conocimiento ms extenso de sus fundamentos para utilizarlos. Desde luego, la descripcin
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 tcnicas de uso. En
compensacin, las contrapartidas obtenidas justifican sin duda el esfuerzo. El programador
puede concentrarse ms en el problema que en los detalles de su implementacin en el fuente,
se incremente la productividad y se gana en claridad conceptual.

6 Funciones y macros

Hay que sealar que algunas funciones pueden venir implementadas de dos formas:
como macro y como funcin. Por ejemplo, la funcin isalnum, contenida en <ctype.h>. Esto
significa que adems de estar implementada como una funcin en la correspondiente librera
(que se utiliza con los argumentos sealados en el manual), est definida como una macro de
preprocesado en <ctype.h>, de forma que salvo indicacin 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 cdigo resultante, que luego
pasa al compilador y al enlazador, no existe nada parecido a una llamada a una
funcin isalnum(tcnicamente el proceso es una sustitucin inline de la funcin de
librera, 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 cdigo, y debajo de la lnea #include <ctype.h>, una lnea 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 cdigo sern respetadas
por el preprocesador. Ms tarde el enlazador cargar el cdigo de isalnum (que extrae de la
librera) con el resto de nuestro programa, y colocar en cada punto de nuestro cdigo donde
aparezca una invocacin a isalnum, un salto a la direccin adecuada.

En estos casos, el resultado es el mismo en ambas modalidades: como macro (por defecto) o
como funcin de librera. La eleccin de una u otra es cuestin de optimizacin. Para tomar una
decisin es necesario comprobar y valorar dos aspectos:

El tamao del ejecutable que resulta en uno y otro caso. Posiblemente mayor si se
utiliza la funcin muchas veces y se adopta la macro.
La velocidad de ejecucin. Posiblemente mayor si se utiliza la funcin muchas veces
(en bucles muy largos) y se utiliza la macro [1].

Inicio.

[1] El cronometraje se puede realizar sencillamente a mano, con un cronmetro, o colocando


marcadores en sitios estratgicos 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 sintctico, el compilador o elenlazador segn los casos. Nos referimos a todos
estos mdulos como "compilador" en un sentido genrico, pues desde un punto de vista
prctico, 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 maysculas iniciales, para simbolizar que es una
librera 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 Librera
Estndar es la forma que tiene C++ de dar soporte a la internacionalizacin de los programas.

[5] Aconsejo descargar la documentacin C++ del "Site" de Borland aunque se trabaje con otro
compilador. Adems de gratuita, es muy completa, bien estructurada y con abundantes
ejemplos.

[6] Posiblemente esta afirmacin puede resultarle sorprendente a ms de uno. En informtica


y en muchos aspectos de la vida, las leyes y normas suelen ir muy por detrs de mundo y la
vida cotidianos. Es frecuente que las estandarizaciones y normativas se limiten a consagrar
"oficialmente" hbitos y costumbres largamente consagrados ya por la prctica. Sin embargo,
en el caso del C++ los acontecimientos se han sucedido a veces de forma contraria. En el
Comit de Estandarizacin participan representantes de la industria (del software) junto con
miembros de laboratorios de investigacin y desarrollo. Tericos de los lenguajes; estudiosos
de las teoras de computacin, de compiladores, Etc. que han tenido tanto o ms peso que
aquellos. El resultado es que en algunos casos el Estndar a introducido y aprobado
herramientas que no estaban suficientemente probadas o generalizadas en la prctica.
Construcciones tericas que ni siguiera eran soportadas por la mayora de compiladores
disponibles comercialmente. Esto, que incluso ha originado comentarios negativos por parte de
algunos miembros del Comit, ha motivado que incluso algn tiempo despus de publicado el
Estndar, muchos compiladores no hubiesen implementado an todas sus caractersticas.

[7] Este primer grupo constituye un caso especial: En principio una librera es algo que ayuda a
realizar determinadas operaciones con ms facilidad que la ofrecida por los mtodos
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 libreras
(denominadas "de soporte" 1.5.2). De forma que en cierto sentido dichas libreras s forman
parte del lenguaje.

[8] Si quiere una perspectiva de a la evolucin de la Librera Estndar y del estado actual
(2013) de la cuestin respecto su uso, versus libreras externas, puede interesarle el artculo
(en Ingls) de Jeff Cogswell "Comparing the C++ Standard and Boost".

Inicio
|ndice| Copyright 1990-2014 Zator Systems.

Bibliotecas o libreras en C++.


Declaracin y uso de libreras. Include
en C++
Secciones C++
Introduccin a C++
Entornos de Desarrollo
o

Comentarios en C++
Estructura de un Programa
Libreras o Bibliotecas
Tipos de Datos
o

Entrada y Salida de Datos


Condicionales
o

Ciclos o Bucles
o
o

Estructuras de Datos
o

Funciones

Junto con los compiladores de C y C++, se incluyen


ciertos archivos llamados bibliotecas mas
comnmente libreras. Las bibliotecas contienen el
cdigo objeto de muchos programas que permiten
hacer cosas comunes, como leer el teclado, escribir
en la pantalla, manejar nmeros, realizar funciones
matemticas, etc.
Las bibliotecas estn clasificadas por el tipo de
trabajos que hacen, hay bibliotecas de entrada y
salida, matemticas, de manejo de memoria, de
manejo de textos y como imaginars existen
muchsimas libreras disponibles y todas con una
funcin especifica.
Nota: Existe una discusin sobre el nombre de estos
archivos. Muchos personas consideran que el
nombre adecuado es archivos de biblioteca, y estan
en lo correcto. Sin embargo, la mayora llamamos a
estos archivos libreras, y tambin me incluyo entre
estos. El error proviene del nombre en ingls, que es
library. Este trmino se traduce como biblioteca, y no
como librera. De este modo a lo largo de esta
seccin las llamar de cualquiera de las dos formas,
para estr mas claros.
Hay un conjunto de bibliotecas (o libreras) muy
especiales, que se incluyen con todos los
compiladores de C y de C++. Son las libreras (o
bibliotecas) ANSI o estndar. Tambin hay libreras
que no son parte del estndar pero en esta seccin
slo usaremos algunas bibliotecas (o libreras) ANSI.
Nota 2: S que esto pinta aburrido, pero es muy til
y realmente las libreras nos facilitan enormemente
el trabajo de programar. Recuerda que antes de
hablar libreras y dems es necesario dominar
algunos conceptos de fundamentacin en general
y otros temas importantes
(ciclos, condicionales y dems) Ahora veamos
algunas libreras y como es su sintaxis.
Qu son exactamente las libreras?
En C++, se conoce como libreras (o bibliotecas) a
cierto tipo de archivos que podemos importar o
incluir en nuestro programa. Estos archivos
contienen las especificaciones de diferentes
funcionalidades ya construidas y utilizables que
podremos agregar a nuestro programa, como por
ejemplo leer del teclado o mostrar algo por pantalla
entre muchas otras ms.
Al poder incluir estas libreras con definiciones de
diferentes funcionalidades podremos ahorrarnos
gran cantidad de cosas, imaginemos por ejemplo
que cada vez que necesitemos leer por teclado,
debamos entonces crear una funcin que lo haga
(algo realmente complejo), al poder contar con las
libreras en C++, podremos hacer uso de una gran
variedad de funciones que nos facilitaran la vida y
aumentarn la modularidad de nuestros cdigos.
Las libreras no son nicamente archivos externos
creados por otros, tambin es posible crear nuestras
propias libreras y utilizarlas en nuestros programas.
Las libreras pueden tener varias extensiones
diferentes, las ms comunes son: .lib, .bpl, .a, .dll, .h
y algunas ms ya no tan comunes.
En conclusin: Las librearas son archivos (no
siempre externos) que nos permiten llevar a cabo
diferentes tareas sin necesidad de preocuparnos por
cmo se hacen sino simplemente entender cmo
usarlas. Las librearas en C++ permiten hacer
nuestros programas ms modulares y reutilizables,
facilitando adems crear programas con
funcionalidades bastante complejas en unas pocas
lneas de cdigo.
Sintaxis para declarar Libreras en C++
La declaracin de libreras, tanto en C como en C++,
se debe hacer al principio de todo nuestro cdigo,
antes de la declaracin de cualquier funcin o lnea
de cdigo, debemos indicarle al compilador que
libreras usar, para el saber que trminos estaran
correctos en la escritura de nuestro cdigo y cules
no. La sintaxis es la siguiente: #include <nombre de
la librera> o alternativamente #include "nombre de
la librera". Cualquiera de las 2 formas es vlida en
C++ (no estoy seguro si en C sea vlido), ten en
cuenta que siempre el nombre de la librera debe ir
entre " y " o entre < y >. En tu cdigo puedes
declarar todas las libreras que quieras aunque en
realidad no tienen sentido declarar una librera que
no vas a usar en tu programa, sin embargo no existe
lmite para esto.
Libreras Estandar de C++ (Standar Template
Library o STL)
A continuacin pondr algunas de las libreras de
uso ms comn de C++ y que forman parte de las
libreras estandar de este lenguaje.
o fstream:
Flujos hacia/desde ficheros. Permite la manipulacin
de archivos desde el programar, tanto leer como
escribir en ellos.
o iosfwd:
Contiene declaraciones adelantadas de todas las
plantillas de flujos y sus typedefs estndar. Por
ejemplo ostream.
o iostream:
Parte del a STL que contiene los algoritmos
estndar, es quiz la ms usada e importante
(aunque no indispensable).
o La biblioteca list:
Parte de la STL relativa a contenedores tipo list;
listas doblemente enlazadas
o math:
Contiene los prototipos de las funciones y otras
definiciones para el uso y manipulacin de funciones
matemticas.
o memory:
Utilidades relativas a la gestin de memoria,
incluyendo asignadores y punteros inteligentes
(auto_ptr).
"auto_ptr" es una clase que conforma la librera
memory y permite un fcil manejo de punteros y su
destruccin automaticamente.
o Biblioteca new:
Manejo de memoria dinmica
o numeric:
Parte de la librera numrica de la STL relativa a
operaciones numricas.
o ostream:
Algoritmos estndar para los flujos de salida.
o queue:
Parte de la STL relativa a contenedores tipo queue
(colas de objetos).
o Librera stdio:
Contiene los prototipos de las funciones, macros, y
tipos para manipular datos de entrada y salida.
o Librera stdlib:
Contiene los prototipos de las funciones, macros, y
tipos para utilidades de uso general.
o string:
Parte de la STL relativa a contenedores tipo string;
una generalizacin de las cadenas alfanumricas
para albergar cadenas de objetos. Muy til para el
fcil uso de las cadenas de caracteres, pues elimina
muchas d elas dificultades que generan los char
o typeinfo:
Mecanismo de identificacin de tipos en tiempo de
ejecucin
o vector:
Parte de la STL relativa a los contenedores tipo
vector; una generalizacin de las matrices
unidimensionales C/C++
o forward_list
Esta librera es til para implementar con gran
facilidad listas enlazadas simples.
o list
Permite implementar listas doblemente enlzadas
(listas enlazadas dobles) facilmente.
o iterator
Proporciona un conjunto de clases para iterar
elementos.
o regex
Proporciona fcil acceso al uso de expresiones
regulares para la comparacin de patrones.
o thread
til para trabajar programacin multihilos y crear
mltiples hilos en nuestra aplicacin.
Nota: Para ms informacin sobre las libreras
estandar de C++ y STL puedes ingresar aqu
Cmo declarar una librera en C++?
Veamos a continuacin como se hara la declaracin
de unas cuantas libreras conocidas, recuerda que
ese pueden declarar todas las libreras necesarias y
siempre debe hacerse al comienzo del cdigo fuente

#include "iostream"
#include "string"
#include <math.h>
#include <conio.h>

using namespace std;

Con esto debi quedar claro, como declarar libreras


C++ al interior de un cdigo fuente. Lo nico
adicional, es la lnea que dice using namespace
std; esta lnea nos ayuda a declarar un espacio de
nombre que evita tener que usarlo cada que
accedemos a alguna funcin especifica de una
librera. Teniendo este namespace declarado
podemos llamar por ejemplo el comando cout >>,
que pertenece a la librera iostream, sin embargo sin
este namespace sera std::cout >>, imagina tener
que hacer esto cada vez que uses algn comando o
funcin de las libreras, sera bastante tedioso.
Acerca del namespace std
Todas las libreras estndar de C++ contienen una
declaracin del espacio de nombre std, es decir que
todas las libreras que hacen parte del estndar de
C++ colocan entidades dentro de este espacio de
nombre.
Por esta razn 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 cdigo.
El espacio de nombre std como tal no es una librera
sino simplemente un namespace, por esta razn no
reemplaza la declaracin de las libreras del cdigo,
simplemente facilita la escritura de ste al momento
de usar las entidades de las libreras estndar. Sin
embargo si vamos a hacer uso de una o varias
libreras estndar de C++ es recomendable que
declaremos el namespace std, para no tener que
estar constantemente escribiendo cosas similares a
las que puse hace unas lneas como std::cin o
similares, dado que nicamente se puede acceder a
la entidades de las libreras estndar por medio del
espacio nombre std.
Muy bien, ahora veamos algunos ejemplos simples
del uso de libreras o bibliotecas en C++
Ejemplo 1 de libreras en C++
En el siguiente ejemplo veremos el uso de la librera
stdlib.h que posee una gran variedad de
funcionalidades, para este ejemplo usaremos la
funcin rand que nos permite generar un nmero
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 nmero con rand y se muestra en pantalla
return 0;
}

En el anterior cdigo hemos hecho uso de dos


libreras: iostream y stdlib. La librera o biblioteca
iostream, nos permitir hacer uso del cin y el cout
para obtener o imprimir valores por pantalla,
respectivamente mientras stdlib nos dar acceso a la
funcin rand que generar por nosotros un nmero
cualquiera.
Ejemplo 2 de libreras en C++
En el siguiente ejemplo veremos el uso de la librera
string.h que nos permite bsicamente crear y
manipular muy fcilmente cadenas de caracteres
#include <string.h>
#include <iostream>

using namespace std;

int main ()
{
cout << ("Hola! Por favor ingrese su nombre ....\n");
string cadena = "Hola "; //Se le da un valor inicial al string

string nombre; //Esta cadena contendr el nombre


cin >> nombre; //Se lee el nombre

cadena = cadena + nombre; //Se juntan el saludo con el nombre usando "+"
cout << (cadena); //Se muestra el resultado final.
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 posicin (ahora estamos en 20)

//Se inserta un 11 en la posicin del 10 11 20 30 40 50


miLista.insert (it,11);

miLista.insert (it,3,18);
//En la actual posicin 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 antando el
iterador
}

return 0;
}

El resultado final de la ejecucin de este cdigo


debera 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 insercin.
Muy bien. He aadido este par de ejemplo a peticin
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
libreras, al menos en la lista que te he puesto, estn
las que vamos a usar para ejemplos y ejercicios y
algunas otras de mas. Si deseas informacin sobre
alguna otra o que ample la informacin sobre
alguna que ya esta aqu, hzmelo saber por medio
de la seccin de comentarios

Ahora vamos a la siguiente seccin y metamosle


mano a algunos cdigos y cmo es su estructura.
Venga!! da clic en el siguiente contenido
llamado Comentarios en C++.

You might also like