Normalmente, los iteradores se usan para acceder a los elementos de un contenedor de forma lineal; sin embargo, con "iteradores de acceso aleatorio", es posible acceder a cualquier elemento de la misma manera que operator[]
.
Para acceder a los elementos arbitrarios en un vectorvec
, se puede utilizar el siguiente:
vec.begin() // 1st
vec.begin()+1 // 2nd
// ...
vec.begin()+(i-1) // ith
// ...
vec.begin()+(vec.size()-1) // last
El siguiente es un ejemplo de un patrón acceso típico (versiones anteriores de C++):
int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
La ventaja de utilizar el iterador es que puede aplicar el mismo patrón con otros contenedores:
sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
sum += *it;
}
Por esta razón, es muy fácil crear código de la plantilla que trabajará la misma independientemente del tipo de contenedor. Otra ventaja de los iteradores es que no supone 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:
sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
Como C++ 11 puede utilizar auto
de no especificar un nombre de tipo complicado mucho del iterador como se ha visto antes (o incluso más complejo):
sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Y, además, no es un simple para cada variante-:
sum = 0;
for (auto value : vec) {
sum += value;
}
Y finalmente también está std::accumulate
donde debe tener cuidado ya sea que esté agregando números enteros o de punto flotante.
no son vectores exclusivos de la STL de C++? Lo editaré sin importar – kevin
@gabe, el título especifica C++. –
kevin: vector es un término genérico que podría ser utilizado por cualquier idioma, en particular los matemáticos relacionados como Mathematica o Matlab. – Gabe