Cómo convertir el iterador vectorial a int en C++

2 minutos de lectura

Estoy buscando un elemento en un vector de C++, y cuando lo encuentro, quiero obtener el índice del elemento encontrado en forma numérica (entero, flotante).

Mi ingenuo intento es este:

int x;
int index;
vector<int> myvector;
vector<int>::iterator it;
it = find(myvector.begin(), myvector.end(), x);  
index = (int) * it;

Este código está dando error. ¿Puede decirme cómo puedo convertir iterador a int (si es posible), o puede decirme cómo puedo obtener el índice del elemento encontrado de otra manera? Gracias.

  • ¿Cuál es el error? El elenco es inútil (pero no incorrecto), ya que *it ya es el valor que desea, y debe verificar que no sea igual a myvector.end() antes de eliminar la referencia (de lo contrario, obtendrá un error de tiempo de ejecución u otro comportamiento indefinido).

    –Mike Seymour

    18 de noviembre de 2014 a las 13:41

  • Solo una nota. No desea convertir el iterador en un int muy rara vez tiene algún sentido. Iterator es más como un puntero en la nomenclatura de la biblioteca estándar de c ++, por lo que apunta a un lugar y puede quitarle la referencia. Y cuando lo consigas podrás medir una distancia desde el principio, igual que con punteros (más o menos).

    – luk32

    18 de noviembre de 2014 a las 13:43


  • Lo siento, me perdí lo que realmente quieres (el índice del elemento, no el valor). Mira mi respuesta.

    –Mike Seymour

    18 de noviembre de 2014 a las 13:45

  • tienes que asegurarte it != myvector.end() antes de intentar desreferenciarlo.

    – John Dibling

    18 de noviembre de 2014 a las 14:02

Necesitas usar la función estándar std::distance

index = std::distance( myvector.begin(), it );

if ( index < myvector.size() )
{
    // do something with the vector element with that index
}

Trate de usar siempre std::distance incluso con iteradores de acceso aleatorio. Esta función está disponible en los estándares C++ nuevos y antiguos.

Si desea el índice del elemento encontrado, entonces esa es la distancia desde el inicio de la secuencia:

index = it - myvector.begin();

o, desde C++11,

index = std::distance(myvector.begin(), it);

que funcionará con cualquier tipo de iterador directo, no solo con los de acceso aleatorio como los de un vector.

¿Ha sido útil esta solución?