Diferencia entre iteradores y punteros en C/C++ con ejemplos

Puntero : Un puntero es una variable que contiene la dirección de otra variable, es decir, la dirección de la ubicación de memoria de la variable. Como cualquier variable o constante, debemos declarar un puntero antes de usarlo para almacenar cualquier dirección de variable.
Sintaxis: 
 

type* var_name;

Ejemplo: 

C++

// The output of this program can be different
// in different runs. Note that the program
// prints address of a variable and a variable
// can be assigned different address in different
// runs.
 
#include <iostream>
 
int main()
{
    int x;
 
    // Prints address of x
    std::cout << &x;
 
    return 0;
}
 
// This code is contributed by sarajadhav12052009

C

// The output of this program can be different
// in different runs. Note that the program
// prints address of a variable and a variable
// can be assigned different address in different
// runs.
#include <stdio.h>
 
int main()
{
    int x;
 
    // Prints address of x
    printf("%p", &x);
 
    return 0;
}
Producción: 

0x7ffcac5ae824

 

Iterador : un iterador es cualquier objeto que, apuntando a algún elemento en un rango de elementos (como una array o un contenedor), tiene la capacidad de iterar a través de los elementos de ese rango. 
Sintaxis: 
 

type_container :: iterator var_name;

Ejemplo: 

CPP

// C++ program to demonstrate iterators
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    // Declaring a vector
    vector<int> v = { 1, 2, 3 };
 
    // Declaring an iterator
    vector<int>::iterator i;
 
    int j;
 
    cout << "Without iterators = ";
 
    // Accessing the elements without using iterators
    for (j = 0; j < 3; ++j) {
        cout << v[j] << " ";
    }
 
    cout << "\nWith iterators = ";
 
    // Accessing the elements using iterators
    for (i = v.begin(); i != v.end(); ++i) {
        cout << *i << " ";
    }
 
    // Adding one more element to vector
    v.push_back(4);
 
    cout << "\nWithout iterators = ";
 
    // Accessing the elements without using iterators
    for (j = 0; j < 4; ++j) {
        cout << v[j] << " ";
    }
 
    cout << "\nWith iterators = ";
 
    // Accessing the elements using iterators
    for (i = v.begin(); i != v.end(); ++i) {
        cout << *i << " ";
    }
 
    return 0;
}
Producción: 

Without iterators = 1 2 3 
With iterators = 1 2 3 
Without iterators = 1 2 3 4 
With iterators = 1 2 3 4

 

Diferencia entre iteradores y punteros: 
los iteradores y los punteros son similares en el sentido de que podemos desreferenciarlos para obtener un valor. Sin embargo, existen diferencias clave de la siguiente manera:
 

Punteros iteradores
Un puntero tiene una dirección en la memoria. Un iterador puede contener un puntero, pero puede ser algo mucho más complejo. Por ejemplo, un iterador puede iterar sobre los datos que están en el sistema de archivos, distribuidos en muchas máquinas o generados localmente mediante programación. 
Un buen ejemplo es un iterador sobre una lista enlazada, el iterador se moverá a través de los elementos que están en los Nodes de la lista cuyas direcciones en la RAM pueden estar dispersas.
Podemos realizar aritmética simple en punteros como incrementar, decrementar, sumar un número entero, etc. No todos los iteradores permiten estas operaciones, por ejemplo, no podemos disminuir un iterador directo o agregar un número entero a un iterador de acceso no aleatorio.
Un puntero de tipo T* puede apuntar a cualquier objeto de tipo T. Un iterador está más restringido, por ejemplo, un vector::iterador solo puede referirse a dobles que están dentro de un contenedor de vectores.
Podemos eliminar un puntero usando eliminar Dado que un iterador hace referencia a objetos en un contenedor, a diferencia de los punteros, no existe el concepto de eliminación para un iterador. (El contenedor es responsable de la gestión de la memoria). 
 

Publicación traducida automáticamente

Artículo escrito por rajnr6 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *