logo

Iteradores en C++ STL

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++:

  1. back_insert_iterator: Inserciones en la parte trasera del contenedor.
  2. front_insert_iterator: Inserciones en la parte delantera del contenedor.
  3. insertar_iterador: Se inserta en cualquier parte del contenedor.

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::comenzarDevuelve un iterador al primer elemento del contenedor dado. comenzar ( recipiente )
std::finDevuelve un iterador al elemento que sigue al último elemento del contenedor dado. fin ( recipiente )
std::rbeginDevuelve un iterador inverso al último elemento del contenedor dado. comenzar ( recipiente )
std::desgarrarDevuelve 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.