Iteradores y su uso en la STL de C++
Aprende los iteradores en C++ y su uso con contenedores y algoritmos STL para recorrer y manipular datos de forma eficiente.
La biblioteca estándar de C++ (STL) se basa en una poderosa abstracción llamada iterador, que permite recorrer estructuras de datos de forma uniforme. Los iteradores son una parte fundamental de los contenedores STL (vector, list, map, set…) y ofrecen un mecanismo coherente para avanzar de un elemento a otro. En este artículo se explican los tipos de iteradores, cómo utilizarlos y cómo interactúan con los algoritmos de la STL.
1) ¿Qué es un iterador?
Un iterador es un objeto que permite acceder a los elementos de un contenedor. Se comporta de forma similar a un puntero, pero está completamente abstraído por la STL.
Sus funciones principales:
- Recorrer un contenedor
- Leer o modificar elementos
- Trabajar con algoritmos de la STL (sort, find, count…)
Ejemplo
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v = {10, 20, 30};
vector<int>::iterator it = v.begin();
cout << *it; // 10
}
2) Tipos de iteradores
Los contenedores STL admiten diferentes categorías de iteradores:
- Input Iterator – solo lectura
- Output Iterator – solo escritura
- Forward Iterator – avance hacia adelante
- Bidirectional Iterator – adelante y atrás
- Random Access Iterator – acceso aleatorio, como un puntero
Ejemplos:
vector → random access iterator
list → bidirectional iterator
map/set → bidirectional iterator
3) begin() y end()
Todos los contenedores STL proporcionan dos funciones esenciales:
- begin() → apunta al primer elemento
- end() → apunta a la posición después del último elemento
vector<int> v = {1, 2, 3};
for (auto it = v.begin(); it != v.end(); ++it) {
cout << *it << " ";
}
4) Iterador constante (const_iterator)
Un iterador constante se utiliza para acceso de solo lectura; no permite modificar los elementos.
vector<int> v = {10, 20, 30};
vector<int>::const_iterator it = v.begin();
// *it = 50; // ERROR: no se puede modificar mediante const_iterator
cout << *it;
5) Iteradores inversos (rbegin & rend)
Permiten recorrer un contenedor en sentido inverso.
vector<int> v = {1, 2, 3};
for (auto it = v.rbegin(); it != v.rend(); ++it) {
cout << *it << " ";
}
// Salida: 3 2 1
6) Modificar elementos con iteradores
vector<int> v = {10, 20, 30};
for (auto it = v.begin(); it != v.end(); ++it) {
*it *= 2;
}
for (int x : v)
cout << x << " ";
// Salida: 20 40 60
7) Iteradores y algoritmos STL
Todos los algoritmos STL funcionan mediante iteradores.
Uso con sort
#include <algorithm>
vector<int> v = {50, 20, 10};
sort(v.begin(), v.end());
Uso con find
auto it = find(v.begin(), v.end(), 20);
Uso con count
int c = count(v.begin(), v.end(), 10);
8) Iterar sobre map y set
#include <map>
#include <iostream>
using namespace std;
int main() {
map<string, int> ages = {
{"Carlos", 25},
{"María", 30},
{"Javier", 28}
};
for (auto it = ages.begin(); it != ages.end(); ++it) {
cout << it->first << " : " << it->second << endl;
}
}
9) Eliminar un elemento usando un iterador
Los iteradores permiten eliminar un elemento específico de forma precisa.
vector<int> v = {10, 20, 30, 40};
auto it = find(v.begin(), v.end(), 20);
if (it != v.end())
v.erase(it);
10) Ventajas de usar iteradores
- Independencia del tipo de contenedor
- Código más claro y legible
- Total compatibilidad con los algoritmos STL
- Acceso eficiente a la memoria
11) TL;DR
- Iterador: forma estándar de acceder a los elementos de un contenedor
- begin/end → iteración hacia adelante
- rbegin/rend → iteración inversa
- const_iterator → solo lectura
- Los algoritmos STL dependen completamente de los iteradores
- Ejemplos probados en Visual Studio 2022 y GCC
Artículos relacionados
Bucles en C++: for, while, do-while
Aprende bucles en C++ con for, while y do-while para repetir tareas y controlar el flujo del programa.
Elementos únicos con std::set y std::multiset en C++
Aprende a utilizar std::set y std::multiset en C++ para trabajar con elementos únicos y colecciones ordenadas.
Estructuras clave-valor con std::map y std::unordered_map en C++
Aprende a utilizar std::map y std::unordered_map en C++ para gestionar estructuras clave-valor de forma eficiente.
Estructuras secuenciales con std::list y std::deque en C++
Aprende a usar std::list y std::deque en C++, incluyendo diferencias de rendimiento y casos de uso prácticos.
La biblioteca algorithm de C++: sort, find, count
Aprende la biblioteca algorithm de C++, incluyendo sort, find, count y otros algoritmos STL para procesar datos eficientemente.
pair, tuple y Structured Binding en C++
Aprende pair, tuple y Structured Binding en C++ para gestionar múltiples valores con un código más limpio y moderno.
Uso de std::vector en C++
Aprende a utilizar std::vector en C++ para trabajar con arreglos dinámicos y gestionar datos de forma eficiente.
Visión general de la biblioteca estándar de C++
Aprende la biblioteca estándar de C++, incluyendo contenedores STL, algoritmos y componentes esenciales del desarrollo moderno.