En primer lugar, se revisan los iteradores C++ estilo quickly.for ejemplo:cómo hacer iteradores de python más expresivos? al igual que C++ iterador
//--- Iterating over vector with iterator.
vector<int> v;
. . .
for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) {
cout << *it << endl;
}
Es flexible. Es fácil cambiar los tipos de contenedores subyacentes. Por ejemplo, puede decidir más adelante que la cantidad de inserciones y eliminaciones es tan alta que una lista sería más eficiente que un vector. También tiene muchas funciones útiles para miembros. Muchas de las funciones miembro para vectores utilizan iteradores, por ejemplo, asignar, insertar o borrar. Además, podemos usar iterator (si se admite) bidireccionalmente, como ++, -. Esto es útil para analizar una secuencia como objetos.
Los problemas de python son: 1: Actualmente, la sintaxis de pitón para bucle es menos flexible que C++ para. (bueno, más seguro) 2: en lugar del estilo "it! = iter.end()", python lanzará una excepción cuando next() no tenga más. No es flexible.
Pregunta 1: ¿Es correcta mi idea anterior?
OK. Aquí viene mi pregunta, ¿cómo implementar un iterador python más potente tan poderoso como los iteradores de C++? Actualmente, la sintaxis de pitón para bucle es menos flexible que C++ para. También encuentro algunas soluciones posibles, como http://www.velocityreviews.com/forums/t684406-pushback-iterator.html. pero le pide al usuario que repliegue algo en lugar de preguntar al iterador -.
Pregunta 2: ¿Cuál es la mejor manera de implementar un iterador bidireccional en python? Al igual que http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/. El pseudo-código es la siguiente:
it = v.begin();
while(it!=v.end()) {
//do sth here
if (condition1)
++it;//suppose this iterator supports ++
if(condition2)
--it;//suppose this iterator supports --
}
Las características principales son: 1) bidireccional, 2) "extremo" más simple de cheques. Los operadores "++" o "-" o las funciones comunes no importan (de todos modos, no tiene diferencia semántica).
Gracias,
Actualización: Tengo algunas soluciones posibles a partir de las respuestas:
i = 0
while i < len(sequence): # or i < len and some_other_condition
star_it = sequence[i]
if condition_one(star_it):
i += 1
if condition_two(star_it):
i = max(i - 1, 0)
Sin embargo, a diferencia de la matriz, de acceso aleatorio de la lista debe ser O (n). Supongo que el objeto "list" en python internamente se implementa usando cosas de la lista vinculada. Por lo tanto, esta solución while loop no es eficiente. Sin embargo, en C++, tenemos "iterador aleatorio", "iterador bidireccional". ¿Cómo debería obtener una mejor solución? Gracias.
¿Puedes dar un ejemplo concreto de algo que no puedes hacer en 'Python' que puedes hacer fácilmente en' C++'? –
El mecanismo de excepción de Python 'yield' + es sorprendentemente flexible (es lo que llamamos" continuaciones "en la programación funcional). Aprende a usarlos correctamente y serás recompensado. Es mucho más fácil definir iteradores compuestos en Python que en C++. –
Esta pregunta es demasiado vaga, y no hay una respuesta real a la pregunta en el formulario actual. –