Diferencia entre revisiones de «Programación en C++/Librería Estándar de Plantillas»

Contenido eliminado Contenido añadido
m Bot controlado: actualizada sintaxis de tabla; cambios triviales
Línea 1:
Editores:<br /><br />
[mailto:oscarpalacios1@yahoo.com Oscar E. Palacios]
== Biblioteca estándar de plantillas ==
<table width="100%">
<tr bgcolor="#eeeeff">
<td width="80" align="center">[[Programación en C++/Biblioteca Estándar de Plantillas/Vectores|Vectores]]</td>
<td width="120" align="center">[[Programación en C++/Biblioteca Estándar de Plantillas/Vectores#Colas de doble fin ( deque )|Colas de doble fin]]</td>
<td width="80" align="center">[[Programación en C++/Biblioteca Estándar de Plantillas/Listas|Listas]]</td>
<td width="96" align="center">[[Programación en C++/Biblioteca Estándar de Plantillas/Pilas|Pilas (stack)]]</td>
<td width="120" align="center">[[Programación en C++/Biblioteca Estándar de Plantillas/Colas|Colas (queue)]]</td>
<td width="120" align="center">[[Programación en C++/Biblioteca Estándar de Plantillas/Colas#Colas con prioridad|Colas con prioridad]]</td>
 
<table{| width="100%">
<td width="60" align="center">[[Programación en C++/Biblioteca Estándar de Plantillas/Sets|Sets]]</td>
<tr|- bgcolor="#eeeeff">
<td width="60" align="center">[[Programación en C++/Biblioteca Estándar de Plantillas/Maps|Maps]]</td>
<td| width="6080" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/BitsetsVectores|BitsetsVectores]]</td>
<td| width="120" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/Vectores#Colas de doble fin ( deque )|Colas de doble fin]]</td>
 
<td| width="80" align="center"> | [[#IteradoresProgramación en C++/Biblioteca Estándar de Plantillas/Listas|IteradoresListas]]</td><td></td>
<td| width="96" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/Pilas|Pilas (stack)]]</td>
</tr>
<td| width="120" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/Colas|Colas (queue)]]</td>
</table>
<td| width="120" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/Colas#Colas con prioridad|Colas con prioridad]]</td>
<td| width="8060" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/VectoresSets|VectoresSets]]</td>
<td| width="8060" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/ListasMaps|ListasMaps]]</td>
<td| width="60" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/SetsBitsets|SetsBitsets]]</td>
| width="80" align="center" | [[#Iteradores|Iteradores]]
|
|}
<div style="background:#fffeee; text-align:justify; padding:40px;">
La STL (Standard Template Library) de C++ es una colección genérica de plantillas de clases y algoritmos que permite a los programadores implementar fácilmente estructuras estándar de datos como colas (queues), listas (lists), y pilas (stacks).
 
La STL de C++ provee a los programadores con lo constructores siguientes, agrupados en tres categorias:
 
'''Secuencias (sequences)'''<br />
# C++ Vectors
# C++ Lists
# C++ Double-Ended Queues
'''Adaptadores de contenedor (Container Adapters)'''<br />
# C++ Stacks
# C++ Queues
# C++ Priority Queues
'''Contenedores asociativos (Associative Containers)'''<br />
# C++ Bitsets
# C++ Maps
# C++ Multimaps
# C++ Sets
# C++ Multisets
 
La idea detras de la STL de C++ es que la parte dificil en el uso de estructuras complejas de datos ya ha sido previamente completada. Por ejemplo, si un programador desea usar un stack de enteros, todo lo que tiene que hacer es escribir el código:
Línea 44 ⟶ 43:
Con un minimo de esfuerzo, él o ella puede usar la función push() para ingresar enteros al stack; y la función pop() para retirar enteros del stack. A travez de la magia de las plantillas de C++, se puede especificar cualquier tipo de dato, no sólo enteros. La clase Stack de la STL provee la funcionalidad genérica de un stack, sin importar el tipo de dato en el stack.
</div>
 
<table{| width="100%">
<tr|- bgcolor="#eeeeff">
<td width="80" align="center">[[Programación en C++/Biblioteca Estándar de Plantillas/Vectores|Vectores]]</td>
<td| width="12080" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/Vectores#Colas de doble fin ( deque )|Colas de doble finVectores]]</td>
<td| width="80120" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/ListasVectores#Colas de doble fin ( deque )|ListasColas de doble fin]]</td>
<td| width="9680" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/PilasListas|Pilas (stack)Listas]]</td>
<td| width="12096" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/ColasPilas|ColasPilas (queuestack)]]</td>
<td| width="120" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/Colas#Colas con prioridad|Colas con prioridad(queue)]]</td>
<td| width="80120" align="center"> | [[Programación en C++/Biblioteca Estándar de Plantillas/Colas#IteradoresColas con prioridad|IteradoresColas con prioridad]]</td>
| width="80" align="center" | [[#Iteradores|Iteradores]]
<td></td>
|
</tr>
|}
</table>
 
== Iteradores ==
<div style="background:#fffeee; text-align:justify; padding:40px;">
El termino '''iterar''' significa (en palabras sencillas) el método o forma que se usa para poder navegar sobre los elementos de una lista específica. Luego, un iterador es como una especie de "puntero especial" que nos permite leer o escribir valores sobre cada uno de los elementos en una lista. Los iteradores pueden ser comparados con los índices que se emplean para leer o escribir valores sobre los elementos de una lista. Igual a lo que sucede con los tipos de datos dentro de un arreglo primitivo en donde para leer o escribir valores sobre los elementos se tiene que prestar atención al tipo de dato, un iterador tiene que ser del tipo de dato que posee la lista. En ese sentido, si tenemos por ejemplo un vector que posee datos de tipo entero ('''int''') entonces el iterador tendrá que ser de tipo entero; si por el contrario se tiene un vector cuyos datos son del tipo cadena ('''string''') entonces el iterador tiene que ser del tipo cadena.<br /><br /><font size="4" color="red">Sintaxis</font><br /><br />La sintaxis general para la declaración de un iterador es:<br /><br /><font size="4">NombrePlantilla<tipo>::iterator varid;</font><br /><br />Donde,
 
<table{| border="0" width="50%" cellpadding="8">
<tr><td>NombrePlantilla</td><td>Es el nombre de una STL</td></tr>
|-
<tr><td>tipo</td><td>Es el tipo usado para la plantilla</td></tr>
<tr><td>| NombrePlantilla</td><td> || Es el nombre de una STL</td></tr>
<tr><td>::iterator</td><td>Es el método para obtener el iterador</td></tr>
|-
<tr><td>varid</td><td>Es el nombre de la variable</td></tr>
<tr><td>| tipo</td><td> || Es el tipo usado para la plantilla</td></tr>
</table><br>Por ejemplo, para obtener un iterador a un '''vector''' de tipo '''int''' podemos usar la instruccion:<br><br><font size="4">vector <int>::iterator el_iterador;</font><br><br>
|-
| ::iterator
<tr><td>::iterator</td><td>| Es el método para obtener el iterador</td></tr>
|-
<tr><td>| varid</td><td> || Es el nombre de la variable</td></tr>
|}<br /table><br>Por ejemplo, para obtener un iterador a un '''vector''' de tipo '''int''' podemos usar la instruccion:<br /><br /><font size="4">vector <int>::iterator el_iterador;</font><br /><br />
A manera de ejemplo, vamos a mostrar un programa en el que se usará un iterador de tipo '''char'''.
::Nota: en el programa se hace uso de los métodos '''begin''' para obtener un iterador hacia el inicio del vector, y '''end''' para obtener un iterador hacia el final del mismo.<br /><br />
 
<source lang=cpp>
Línea 99 ⟶ 104:
 
== Iteradores reversos ==
La STL de C++ permite que los elementos de las listas creadas puedan ser navegados en orden "normal", es decir desde el primero hasta el último de los elementos agregados a la lista, y para dichas tareas se usa un iterador normal. También, los elementos pueden navegarse en orden "reverso" y en tales casos se usa un iterador en reverso ( '''reverse_iterator''' ). Un ejemplo de reverse_iterator se muestra en el siguiente programa.<br /><br />
Notas:
* Se debe de observar que para obtener iteradores normales se usan (generalmente) los métodos '''begin()''' y '''end()''', mientras que que para obtener iteradores reversos se emplean los métodos '''rbegin()''' y '''rend()'''.
* Los iteradores reversos se comportan de manera inversa. Por ejemplo, para obtener un iterador que vaya desde el final hasta el inicio de los elementos, se usa la función '''rbegin()''' la cual regresará un iterador para procesar la lista desde el último hasta el primero de los elementos. En contraparte, la función '''begin()''' regresa un iterador para procesar la lista desde el primero hasta el último de los elementos. Es decir, begin() regresa una referencia hacia el primer elemento, mientras que rbegin() regresa una referencia hacia el último elemento.
<source lang=cpp>
// Demostracion del uso de iteradores reversos