Pregunta

Yo estoy volviendo a c++ después de estar ausente por un poco y tratando de desempolvar el viejo melón.

En Java Iterador es un interfaz para un contenedor de tener métodos:hasNext(), next() y remove().La presencia de hasNext() significa que tiene el concepto de un límite para el contenedor de ser atravesado.

//with an Iterator
Iterator<String> iter = trees.iterator();
while (iter.hasNext()) 
{
    System.out.println(iter.next());
}

En el estándar de C++ biblioteca de plantillas, los iteradores parecen representar un tipo o clase de la ayuda al operador++ y el operador==, pero tiene no existe el concepto de un límite construido en la comparación es necesario antes de avanzar al siguiente elemento.El límite tiene activada por el usuario comparar dos iteradores en el caso normal de la segunda iteración es el contenedor final.

vector<int> vec;
vector<int>::iterator iter;

// Add some elements to vector
v.push_back(1);
v.push_back(4);
v.push_back(8);

for(iter= v.begin(); iter != v.end(); iter++)
{
    cout << *i << " "; //Should output 1 4 8
}

La parte interesante aquí es que en C++ es un puntero, un iterador a una matriz.La STL tomó lo que era existente y construir convención a su alrededor.

Que hay alguna sutileza a lo que me estoy perdiendo?

¿Fue útil?

Solución

Sí, hay una gran diferencia conceptual.C++ utiliza diferentes "clases" de los iteradores.Algunos son utilizados para el acceso aleatorio (a diferencia de Java), algunos de ellos se utilizan para el acceso (como java).Mientras que otros se utilizan para la escritura de datos (para uso con, digamos, transform).

Ver los iteradores concepto en el Documentación De C++ :

  • Iterador De Entrada
  • Salida Del Iterador
  • Adelante Iterador
  • Iterador Bidireccional
  • Iterador De Acceso Aleatorio

Estos son mucho más interesantes y potentes en comparación con Java/C#'s insignificantes de los iteradores.Esperemos que estos convenios serán codificadas usando C++0x del Conceptos.

Otros consejos

Tal vez un poco más teórico.Matemáticamente, las colecciones en C++ puede ser descrito como un semi-abierta intervalo de iteradores, a saber, un iterador que apunta a la estrella de la colección y un iterador que apunta justo detrás de el último elemento.

Este convenio abre una infinidad de posibilidades.La forma de trabajo de los algoritmos en C++, que puede ser aplicado a las subsecuencias de una colección mayor.Para hacer tal cosa trabajar en Java, usted tiene que crear un contenedor de una colección existente que devuelve un diferente iterador.

Otro aspecto importante de los iteradores ya ha sido mencionado por Frank.Existen diferentes conceptos de iteradores.Java iteradores corresponden a la de C++' iteradores de entrada, es decir,son de sólo lectura iteradores que sólo puede ser incrementado un paso a la vez y no puede ir hacia atrás.

En el otro extremo, se tiene C punteros que corresponden exactamente a la de C++ el concepto de iterador de acceso aleatorio.

Con todo, C++ ofrece una mucho más rica y más puro concepto que puede ser aplicado a una variedad mucho más amplia de tareas que cualquiera de los punteros de C o Java iteradores.

Como se ha mencionado, Java y C# iteradores describir un entremezclado de posición(estado) y el rango(valor), mientras que C++ iteradores de separar los conceptos de posición y rango.C++ iteradores representan "¿dónde estoy ahora "separado de" ¿dónde puedo ir?'.

Java y C# iteradores no pueden ser copiados.Usted no puede recuperar una posición anterior.El común de C++ iteradores pueden.

Considere la posibilidad de este ejemplo:

// for each element in vec
for(iter a = vec.begin(); a != vec.end(); ++a){
  // critical step!  We will revisit 'a' later.
  iter cur = a; 
  unsigned i = 0;
  // print 3 elements
  for(; cur != vec.end() && i < 3; ++cur, ++i){
      cout << *cur << " ";
  }
  cout << "\n";
}

Haga clic en el enlace de arriba para ver la salida del programa.

Esta bastante tonta lazo va a través de una secuencia (usando adelante iterador semántica solamente), la impresión de cada contiguos larga de 3 elementos exactamente una vez (y un par más corto subsecuencias al final).Pero suponiendo que N elementos, y M elementos por línea, en lugar de 3, este algoritmo todavía sería O(N*M) iterador incrementos, y O(1) espacio.

El estilo del Java iteradores carecen de la capacidad para almacenar la posición de forma independiente.Usted va a

  • perder O(1) espacio, mediante (por ejemplo) una matriz de tamaño M para la tienda de la historia recorrer
  • tendrá que recorrer la lista de N veces, siendo O(N^2+N*M) tiempo
  • o el uso de un concreto tipo de Matriz con GetAt función miembro, perdiendo genericism y la capacidad de uso de la lista enlazada tipos de contenedores.

Desde sólo hacia adelante iteración mecánica se utiliza en este ejemplo, yo era capaz de cambiar en una lista con no hay problemas.Esto es crítico para la creación de algoritmos genéricos, tales como la búsqueda, el retraso de inicialización y la evaluación, clasificación, etc.

La incapacidad para retener el estado corresponde más estrechamente a la STL de C++ iterador de entrada, en la que muy pocos son los algoritmos construidos.

Un puntero a un elemento de la matriz es de hecho un iterador en la matriz.

Como usted dice, en Java, un iterador tiene más conocimiento de la base del recipiente que en C++.C++ son los iteradores general, y un par de iteradores puede denotar cualquier rango:esto puede ser un sub-intervalo de un contenedor, una gama de más de varios contenedores (ver http://www.justsoftwaresolutions.co.uk/articles/pair_iterators.pdf o http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/zip_iterator.html) o incluso un rango de números (ver http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/counting_iterator.html)

El iterador categorías de identificar lo que puede y no puede hacer con un iterador.

Para mí la diferencia fundamental es que Java Iteradores punto entre los elementos, mientras que C++ STL iteradores se señalan los elementos.

C++ iteradores son una generalización de las puntero del concepto;ellos hacen que sea aplicable a una amplia gama de situaciones.Esto significa que pueden ser utilizados para hacer cosas tales como definir arbitraria rangos.

Java iteradores son relativamente tonto enumeradores (aunque no tan malo como C#'s;en menos de Java ha ListIterator y puede ser utilizado para mutar la colección).

Los iteradores son sólo equivalente a la de los punteros en el caso trivial de la iteración sobre el contenido de una matriz en la secuencia.Un iterador podría ser el suministro de objetos de cualquier número de otras fuentes:a partir de una base de datos, a partir de un archivo de la red, de otro cálculo, etc.

Biblioteca de C++ (la parte antes conocido como STL) iteradores son diseñados para ser compatibles con los punteros.Java, sin aritmética de punteros, tenía la libertad para ser más programador-friendly.

En C++ que usted termina encima de tener que utilizar un par de iteradores.En Java que utilizar un iterador o una colección.Los iteradores se supone que el pegamento entre el algoritmo y estructura de datos.El código escrito para 1.5+ rara vez se necesita mencionar los iteradores, a menos que sea la implementación de un algoritmo concreto o estructura de datos (que el variar de la mayoría de los programadores no tienen ninguna necesidad de hacer).Como Java va para la dinámica de la polimorfismo subconjuntos y similares son mucho más fáciles de manejar.

Hay un montón de buenas respuestas acerca de las diferencias, pero sentí que la cosa que me molesta más con Java iteradores no era subrayó: no Se puede leer el valor actual varias veces.Esto es realmente útil en una gran cantidad de escenarios, especialmente cuando se desea combinar los iteradores.

En c++, tiene un método para avanzar en el iterador y para leer el valor actual.La lectura de su valor no avanzar en la iteración;lo que se puede leer varias veces.Esto no es posible con Java iteradores, y me acaban de crear contenedores que hacer esto.

Una nota lateral:una forma fácil de crear un contenedor es utilizar una existente--PeekingIterator a partir de la Guayaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top