Un iterador en C++ es un objeto similar a un puntero que apunta a un elemento del contenedor STL. Generalmente se utilizan para recorrer el contenido del contenedor STL en C++. La principal ventaja de los iteradores STL es que hacen que los algoritmos STL sean independientes del tipo de contenedor utilizado. Podemos simplemente pasar el iterador a los elementos del contenedor en lugar del propio contenedor a los algoritmos STL.
Declaración de iterador
Cada contenedor en C++ STL tiene su propio iterador. Entonces tenemos que declarar un iterador como:
C++
<type>::iterator it;
dónde
- tipo: Tipo de contenedor para el que se declara el iterador.
- él: Nombre asignado al objeto iterador.
Luego podemos inicializarlo asignando algún iterador válido. Si ya tenemos un iterador para asignar en el momento de la declaración, entonces podemos omitir la declaración de tipo usando el auto palabra clave.
C++auto it = iter
dónde iterar es el iterador asignado al iterador it recién creado.
Nuestro Curso C++ cubre el uso de iteradores en STL, lo que garantiza que comprenda cómo atravesar diferentes tipos de contenedores.
Ejemplo de iteradores
El siguiente programa ilustra cómo utilizar el iterador para atravesar el contenedor de vectores:
C++#include using namespace std; int main() { vector<int> v = {1 2 3 4 5}; // Defining an iterator pointing to // the beginning of the vector vector<int>::iterator first = v.begin(); // Defining an iterator pointing // to the end of the vector vector<int>::iterator last = v.end(); // Iterating the whole vector while(first != last) { cout << *first << ' '; first++; } return 0; }
Producción
1 2 3 4 5
Como habrás notado, hemos utilizado vector::comienzo() y vector::fin() función. Estas funciones son las funciones miembro de std::vector que devuelven el iterador al primer elemento y un elemento después del último elemento del vector. Usamos el retorno de iteradores de estas funciones para iterar los vectores.
Funciones de iterador de contenedor
C++ STL proporciona algunas funciones miembro en Contenedor STL que devuelven los iteradores al menos al primer y al último elemento. Estas funciones miembro están definidas en casi todo el contenedor STL (dejando algunos contenedores de acceso limitado como pila cola ) con el mismo nombre por coherencia.
La siguiente tabla enumera todos los métodos que devuelven el iterador a los contenedores:
Función iteradora | Valor de retorno |
|---|---|
comenzar() | Devuelve un iterador al principio del contenedor. |
fin() | Devuelve un iterador al elemento teórico justo después del último elemento del contenedor. |
comenzar() | Devuelve un iterador constante al principio del contenedor. Un iterador constante no puede modificar el valor del elemento al que apunta. |
algunos() formatear una fecha en java | Devuelve un iterador constante al elemento teórico justo después del último elemento del contenedor. |
comenzar() | Devuelve un iterador inverso al principio del contenedor. |
prestar() | Devuelve un iterador inverso al elemento teórico justo después del último elemento del contenedor. |
crbegin() | Devuelve un iterador inverso constante al principio del contenedor. |
CRENDIR () | Devuelve un iterador inverso constante al elemento teórico justo después del último elemento del contenedor. |
Por ejemplo si una cosa es el nombre del vector, entonces podemos usar los métodos anteriores como se muestra a continuación:
C++vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend() vec.cend() vec.crend()
Operaciones de iteradores
Al igual que la aritmética de punteros, hay algunas operaciones que están permitidas en los iteradores de C++. Se utilizan para proporcionar diferentes funcionalidades que aumentan la importancia de los iteradores. Hay 5 válidos operaciones de iterador en C++ :
- Iteradores de desreferenciación
- Iteradores incrementales/decrementantes
- Sumar/Restar números enteros a iteradores
- Restando otro iterador
- Comparando iteradores
Iteradores de desreferenciación
La operación de desreferenciación permite a los usuarios acceder o actualizar el valor del elemento señalado por el iterador. Usamos el (*) operador de indirección para desreferenciar iteradores como si fueran punteros.
C++// Access *it; // Update *it = new_val;
dónde nuevo_val es el nuevo valor asignado al elemento señalado por el iterador él .
Iteradores incrementales/decrementantes
Podemos incrementar o disminuir el iterador en 1 usando Operadores (++) o (--) respectivamente. La operación de incremento mueve el iterador al siguiente elemento en el contenedor mientras que la operación de decremento mueve el iterador al elemento anterior.
C++it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement
Sumar/Restar números enteros a iteradores
También podemos sumar o restar un valor entero de los iteradores. Aumentará la posición anterior o siguiente del iterador según el valor entero agregado.
C++// Addition it + int_val; // Subtraction it - int_val;
dónde valor_int son los valores enteros que se suman o restan del iterador él .
Restando otro iterador
Podemos restar un iterador de otro para encontrar la distancia (o el número de elementos) entre la memoria a la que apuntan.
C++it1 - it2
Comparando iteradores
También podemos probar los dos iteradores del mismo tipo entre sí para encontrar la relación entre ellos. Podemos usar operadores relacionales como (==) igualdad y (!=) desigualdad junto con otros operadores relacionales como< > <= >=.
C++it1 != it2 // Equal to it1 == it2 // Not equal to it1 > it2 // Greater than it1 < it2 // Less than it1 >= it2 // Greater than equal to it1 <= it2 // Less than equal to
Tipos de iteradores en C++
Los iteradores STL se pueden dividir según las operaciones que se pueden realizar en ellos. Hay cinco tipos principales de iteradores en C++ que se enumeran en la siguiente tabla junto con los contenedores admitidos y las operaciones de iterador admitidas.
Iterador | Descripción | Contenedores compatibles | Operaciones soportadas |
|---|---|---|---|
Iterador de entrada | Es un iterador unidireccional que se utiliza para leer los valores. | Flujo de entrada | Desreferenciación de la igualdad de incremento |
Iterador de salida | También es un iterador unidireccional pero se utiliza para asignar los valores. No puede acceder a los valores. | Flujo de salida | Desreferenciación (sólo escritura) Incremento |
Iteradores directos | Puede acceder y asignar los valores. Es la combinación de iterador de entrada y salida. | lista_adelante mapa_desordenado conjunto_desordenado | Desreferenciación de la igualdad de incremento |
Iteradores bidireccionales | Puede moverse en ambas direcciones, ya sea hacia adelante o hacia atrás. Los contenedores como conjunto de listas y mapas múltiples admiten iteradores bidireccionales. | lista conjunto de mapas multimapa multiconjunto | Desreferenciación Incremento/Decremento Igualdad |
Iteradores de acceso aleatorio | Los iteradores de acceso aleatorio son iteradores que se pueden utilizar para acceder a elementos alejados del elemento al que apuntan y ofrecen la misma funcionalidad que los punteros. | cadena de matriz deque vectorial ventana.abrir javascript | Todo |
Como habrámos notado en la tabla anterior, aparte de los iteradores de entrada y salida A medida que avanzamos en la tabla, el tipo de iterador contiene las características del iterador anterior junto con algunas características nuevas.
Adaptadores de iterador
Los adaptadores de iterador en C++ son el tipo especial de iteradores que se crean sobre iteradores tradicionales para proporcionar funcionalidad especializada. Hay muchos adaptadores de iterador en C++, algunos de los cuales se detallan a continuación:
Tipo de adaptadores de iterador | Descripción |
|---|---|
Iterador inverso | El iterador inverso está construido sobre un tipo de operador bidireccional o superior y permite a los usuarios atravesar el contenedor en la dirección inversa. |
Iteradores de flujo | Los iteradores de flujo, es decir, los iteradores istream y ostream, se basan en los iteradores de entrada y salida respectivamente. Estos iteradores permiten a los usuarios utilizar los flujos como contenedores. |
Mover iteradores | Los iteradores de movimiento se utilizan para introducir la semántica de movimiento en los algoritmos STL. Los iteradores de movimiento mueven la propiedad de los datos del contenedor copiado al contenedor de copia sin crear copias adicionales. |
Iterador de inserción | Los iteradores del insertador le permiten insertar los elementos dados en alguna posición del contenedor. Hay tres iteradores de inserción en C++:
Estos iteradores se pueden crear usando insertador_back() insertador_frontal() insertar() funciones en C++. |
Funciones de utilidad iterador en C++
C++ STL proporciona diversas funciones para simplificar el trabajo con iteradores. Se enumeran en la siguiente tabla:
| Función | Descripción | Sintaxis |
|---|---|---|
| std::avanzado | Avanza un iterador un número específico de posiciones. | avance ( eso n ) |
| std::siguiente | Devuelve el iterador que está un número específico de posiciones por delante del iterador dado. | próximo ( eso n ) |
| Estándar :: Anterior | Devuelve el iterador que está un número específico de posiciones detrás del iterador dado. | anterior ( eso n ) |
| std::distancia | Devuelve el número de elementos entre dos iteradores. | distancia ( eso1 eso2 ) |
| std::comenzar | Devuelve un iterador al primer elemento del contenedor dado. | comenzar ( recipiente ) |
| std::fin | Devuelve un iterador al elemento que sigue al último elemento del contenedor dado. | fin ( recipiente ) |
| std::rbegin | Devuelve un iterador inverso al último elemento del contenedor dado. | comenzar ( recipiente ) |
| std::desgarrar | Devuelve un iterador inverso al elemento que precede al primer elemento del contenedor dado. | marcas ( recipiente ) |
| std::insertor | Crea un iterador de inserción que inserta elementos en un contenedor en una posición especificada. | insertador ( posición del contenedor ) |
| std::back_inserter | Crea un iterador de inserción posterior que agrega elementos al final de un contenedor. | insertador de espalda ( recipiente ) |
| std::front_inserter | Crea un iterador de inserción frontal que inserta elementos en la parte frontal de un contenedor. | insertador_frontal ( recipiente ) |
Aplicaciones de iteradores con ejemplos
Los iteradores se utilizan ampliamente en C++ para muchos propósitos diferentes mientras se trabaja con contenedores y algoritmos STL. A continuación se muestran algunas aplicaciones principales de iteradores en C++ cuyos ejemplos de código son:
Atravesando contenedores
Atravesar contenedores STL es la aplicación más básica de los iteradores. En esto usamos las funciones comenzar() y finalizar() para hacer que los iteradores de inicio y fin atraviesen todo el contenedor. Básicamente seguimos incrementando el iterador inicial hasta que no sea igual al final.
Ejemplo
C++#include using namespace std; int main() { set<int> s = {10 20 30 40 50}; // Iterator to the beginning // of the set auto it = s.begin(); // Iterating through the // entire set while (it != s.end()) { // Dereferencing iterator // to access value cout << *it << ' '; // Incrementing the // iterator it++; } return 0; }
Producción
10 20 30 40 50
Como se muestra en el código anterior, atravesamos el contenedor establecido. De manera similar, podemos utilizar el mismo enfoque para atravesar cualquier contenedor.
Invertir un contenedor
Los iteradores inversos le permiten recorrer un contenedor desde el final hasta el principio sin necesidad de manejar manualmente la inversión.
Ejemplo
C++#include using namespace std; int main() { vector<int> vec = {10 20 30 40 50}; // Defining reverse iterators // pointing to the reverse // beginning of vec auto it = vec.rbegin(); // Iterating the whole // vector in reverse while (it != vec.rend()) { cout << *it << ' '; it++; } return 0; }
Producción
50 40 30 20 10
Algoritmos independientes del contenedor
Los iteradores permiten que los algoritmos funcionen con cualquier tipo de contenedor, lo que hace que funciones como std::sort() std::find() y std::for_each() sean más flexibles. Puede pasar iteradores en lugar del contenedor real.
Ejemplo
C++#include using namespace std; int main() { vector<int> vec = {30 10 40 10 50}; multiset<int> ms = {10 30 10 20 40 10}; // Using the std::count() algorithm to count // the number of occurences of 10 in vector // and multiset using iterator cout << '10s in Vector: ' << count(vec.begin() vec.end() 10) << endl; cout << '10s in Multiset: ' << count(ms.begin() ms.end() 10); return 0; }
Producción
10s in Vector: 2 10s in Multiset: 3
Aplicaciones adicionales de iteradores
Hay más aplicaciones de iteradores STL:
- Cálculo de distancia: El uso de iteradores std::distance() ayuda a calcular la cantidad de elementos entre dos posiciones en un contenedor.
- Iteración de flujo: Los iteradores de flujo le permiten tratar flujos de entrada/salida como contenedores, lo que facilita la lectura y escritura de flujos utilizando algoritmos STL.
- Mover semántica en algoritmos STL: Los iteradores de movimiento introducen la semántica de movimiento en los algoritmos STL, lo que ayuda a aumentar el rendimiento y la eficiencia al evitar copias innecesarias. Los datos se moverán según las reglas de la semántica de movimiento.
- Iteradores personalizados para estructuras de datos: Se pueden implementar iteradores personalizados para estructuras de datos que no son STL, como árboles o gráficos, para brindar soporte para algoritmos STL y muchas otras características. Es posible que debamos seguir un conjunto de reglas y convenciones para proporcionar operaciones incrementales, decrementales y otras operaciones adecuadas.