2010-06-01 11 views
6

Necesito cout y devolver el índice de un elemento deque al que apunta un iterador. ¿Cómo obtengo un int de un iterador?En C++, ¿cómo obtengo un índice int de un iterador?

+0

¿Por qué necesita el índice? ¿No puedes simplemente desreferenciar el objeto y hacer aritmética iterativa en él? –

+0

¿Cómo es eso? ¿No sería la desreferenciación del iterador igual que desreferenciar un puntero y darme la dirección de la memoria, no la ubicación en el deque? – user83

Respuesta

3
std::ptrdiff_t index = std::distance(myDeque.begin(), curIterator); 
9

que puede utilizar:

std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator)); 

estar al tanto de los costes de ejecución de una rutina de este tipo, sin embargo- que depende de la estructura de datos que utiliza.

+1

O más bien depende de la clase de iterador (aleatorio, reenvío, etc.) –

+0

Estoy asumiendo pasos de distancia a través de cada elemento del contenedor para encontrar el número, por lo que para una gran deque el costo del tiempo de ejecución sería grande. Sin embargo, mi deque no debe ser mayor de 10 elementos. ¿Y la distancia devuelve un int? ¿Qué hace la llamada index()? – user83

+0

Si su deque no debe contener más de 10 elementos, entonces enviaría que debería usar 'vector' en su lugar, o al menos tener una buena razón para seguir con deque. El índice() "llamada" es simplemente una variable llamada 'index' que se construye con el valor de retorno de' std :: distance'. – fbrereto

4

Para iteradores de acceso aleatorio sólo puede utilizar restas:

size_t index = some_iterator - some_deque.begin() 

Obviamente, esto no funciona para todos los iteradores pero me gustaría sostienen que hay una cierta elegancia en (por ejemplo, para std::list o lo que sea). que solo puedes usar esta técnica cuando llevará un tiempo constante. Si su contenedor no tiene iteradores de acceso aleatorio, entonces probablemente no sea sensato tratar de encontrar el índice de ellos de todos modos.

+0

Creo que voy a votar esta la mejor respuesta por su simplicidad y elegancia. ¿Podría asignar el resultado a un int para que lo emita a un int? – user83

+0

Puede asignarlo a un int, pero probablemente obtendrá una advertencia del compilador en niveles de advertencia más altos (ya sea la conversión sin firma-> firmada o el acortamiento real del tipo, dependiendo del compilador, etc.).Es un poco molesto tener que lanzar explícitamente a int, pero eso no va a esconder un problema a menos que tengas más de 2 mil millones de elementos en tu deque, lo que supongo que estarás bastante seguro de que no lo harás :) – Peter

2

Fuera de los dos métodos que se presentan:

std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator)); 

y

std::ptrdiff_t index = some_iterator - some_deque.begin() 

... Este último tiene la superioridad de ser aplicable únicamente a los iteradores de acceso aleatorio - por lo tanto, cuando se sustituye por otro contenedor , accidentalmente obtendrá una operación costosa (O (n) para listas, por ejemplo).

Cuestiones relacionadas