El objetivo es acceder al elemento "n-ésimo" de un vector de cadenas en lugar del operador [] o el método "at". Por lo que tengo entendido, los iteradores se pueden usar para navegar a través de contenedores, pero nunca antes había usado iteradores y lo que estoy leyendo es confuso.
Si alguien pudiera darme alguna información sobre cómo lograrlo, se lo agradecería. Gracias.

Respuestas:
Debe hacer uso del método
beginyendde lavectorclase, que devuelve el iterador que hace referencia al primer y último elemento respectivamente.fuente
std::vectortiene iteradores de acceso aleatorio.std::advance(it, n). Está definido para hacer exactamente lo que desea y se usará automáticamenteit + nsi el iterador está etiquetado como de acceso aleatorio, o hará el ciclo si es necesario.Normalmente, los iteradores se utilizan para acceder a elementos de un contenedor de forma lineal; sin embargo, con los "iteradores de acceso aleatorio", es posible acceder a cualquier elemento de la misma forma que
operator[].Para acceder a elementos arbitrarios en un vector
vec, puede utilizar lo siguiente:El siguiente es un ejemplo de un patrón de acceso típico (versiones anteriores de C ++):
La ventaja de usar iterador es que puede aplicar el mismo patrón con otros contenedores :
Por esta razón, es realmente fácil crear un código de plantilla que funcione igual independientemente del tipo de contenedor . Otra ventaja de los iteradores es que no asume que los datos residen en la memoria; por ejemplo, se podría crear un iterador directo que pueda leer datos de un flujo de entrada, o que simplemente genere datos sobre la marcha (por ejemplo, un generador de rango o de números aleatorios).
Otra opción usando
std::for_eachy lambdas:Desde C ++ 11, puede utilizar
autopara evitar especificar un nombre de tipo muy largo y complicado del iterador como se vio antes (o incluso más complejo):Y, además, hay una variante más simple para cada variante:
Y finalmente, también hay
std::accumulateque tener cuidado si está agregando números enteros o de punto flotante.fuente
En C ++ - 11 puede hacer:
Consulte aquí las variaciones: https://en.cppreference.com/w/cpp/language/range-for
fuente
7.5.0en Ubuntu 18.04 y funciona para la matriz de la misma manera.Los iteradores de Vector son iteradores de acceso aleatorio, lo que significa que se ven y se sienten como punteros simples.
Puede acceder al enésimo elemento agregando n al iterador devuelto por el
begin()método del contenedor , o puede usar el operador[].Alternativamente, puede utilizar la función de avance que funciona con todo tipo de iteradores. (Debería considerar si realmente desea realizar un "acceso aleatorio" con iteradores de acceso no aleatorio, ya que eso podría ser algo costoso).
fuente
advancepara iteradores de acceso aleatorio, o iteradores de categoría desconocida, ya que se garantiza que operará en tiempo constante en ese caso. Esta es la razón por la que los iteradores definidos por el usuario deben etiquetarse correctamente.advancees realmente molesto de usar (debido al uso del parámetro out) si sabe que está tratando con iteradores de acceso aleatorio. Solo lo recomendaría en código genérico, y si no se usa mucho (si el algoritmo no admite bien los iteradores de acceso no aleatorio, que así sea, por ejemplo,std::sortpodría ordenar unstd::listpero no lo hace porque sería ridículamente ineficiente ).operator+. Pero la pregunta era explícitamente sobre el vector, por lo que no hay nada de malo en la primera parte de su respuesta. Solo pensé que la segunda parte podría implicar "no se puede usar el avance con iteradores de acceso aleatorio, incluso si lo desea" para alguien que nunca ha vistoadvanceantes.Vectordebe estar en minúsculasA continuación, se muestra un ejemplo de cómo acceder al
ithíndice destd::vectorunstd::iteratordentro de un bucle que no requiere incrementar dos iteradores.Sin un bucle for
y usando el
atmétodo:fuente