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
begin
yend
de lavector
clase, que devuelve el iterador que hace referencia al primer y último elemento respectivamente.fuente
std::vector
tiene iteradores de acceso aleatorio.std::advance(it, n)
. Está definido para hacer exactamente lo que desea y se usará automáticamenteit + n
si 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_each
y lambdas:Desde C ++ 11, puede utilizar
auto
para 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::accumulate
que 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.0
en 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
advance
para 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.advance
es 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::sort
podría ordenar unstd::list
pero 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 vistoadvance
antes.Vector
debe estar en minúsculasA continuación, se muestra un ejemplo de cómo acceder al
ith
índice destd::vector
unstd::iterator
dentro de un bucle que no requiere incrementar dos iteradores.Sin un bucle for
y usando el
at
método:fuente