Solo para responder a su pregunta, puede usar un iterador:
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Si desea modificar el contenido del vector en el bucle for, use en iterator
lugar de const_iterator
.
Pero hay mucho más que se puede decir sobre esto. Si solo quiere una respuesta que pueda usar, entonces puede detenerse aquí; de lo contrario, sigue leyendo.
auto (C ++ 11) / typedef
Esta no es otra solución, sino un complemento de la iterator
solución anterior . Si está utilizando el estándar C ++ 11 (o posterior), puede usar la auto
palabra clave para ayudar a la legibilidad:
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Pero el tipo de i
será no constante (es decir, el compilador lo usará std::vector<char>::iterator
como tipo de i
).
En este caso, también podría usar un typedef
(no restringido a C ++ 11, y muy útil para usar de todos modos):
typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
mostrador
Por supuesto, puede usar un tipo entero para registrar su posición en el for
bucle:
for(int i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
Si va a hacer esto, es mejor usar los tipos de miembros del contenedor, si están disponibles y son apropiados. std::vector
tiene un tipo de miembro llamado size_type
para este trabajo: es el tipo devuelto por el size
método.
// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
¿Por qué no solo usar esto sobre la iterator
solución? Para casos simples, también podría iterator
hacerlo , pero el punto es que la clase es un objeto diseñado para hacer este trabajo para objetos más complicados donde esta solución no será ideal.
basado en rango para bucle (C ++ 11)
Ver la solución de Jefffrey . En C ++ 11 (y versiones posteriores) puede usar el nuevo for
bucle basado en rango , que se ve así:
for (auto i: path)
std::cout << i << ' ';
Dado que path
es un vector de elementos (explícitamente std::vector<char>
), el objeto i
es del tipo del elemento del vector (es decir, explícitamente, es de tipo char
). El objeto i
tiene un valor que es una copia del elemento real en el path
objeto. Por lo tanto, todos los cambios i
en el bucle no se conservan en path
sí mismos. Además, si desea imponer el hecho de que no desea poder cambiar el valor copiado de i
en el bucle, puede forzar que el tipo de i
sea const char
así:
for (const auto i: path)
std::cout << i << ' ';
Si desea modificar los elementos path
, puede usar una referencia:
for (auto& i: path)
std::cout << i << ' ';
e incluso si no desea modificar path
, si la copia de objetos es costosa, debe usar una referencia constante en lugar de copiar por valor:
for (const auto& i: path)
std::cout << i << ' ';
std :: copy
Ver la respuesta de Joshua . Puede usar el algoritmo STL std::copy
para copiar el contenido del vector en la secuencia de salida. Esta es una solución elegante si se siente cómodo con ella (y además, es muy útil, no solo en este caso de imprimir el contenido de un vector).
std :: for_each
Ver la solución de Max . Usar std::for_each
es excesivo para este escenario simple, pero es una solución muy útil si desea hacer algo más que imprimir en la pantalla: usar le std::for_each
permite realizar cualquier operación (sensata) en el contenido del vector.
sobrecarga ostream :: operador <<
Vea la respuesta de Chris , esto es más un complemento de las otras respuestas, ya que aún tendrá que implementar una de las soluciones anteriores en la sobrecarga. En su ejemplo, utilizó un contador en un for
bucle. Por ejemplo, así es como podría usar rápidamente la solución de Joshua :
template <typename T>
std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
if ( !v.empty() ) {
out << '[';
std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
out << "\b\b]";
}
return out;
}
El uso de cualquiera de las otras soluciones debe ser sencillo.
conclusión
Cualquiera de las soluciones presentadas aquí funcionará. Depende de usted y del código en cuál es el "mejor". Probablemente sea mejor dejar algo más detallado que esto para otra pregunta en la que los pros / contras puedan evaluarse adecuadamente; pero, como siempre, la preferencia del usuario siempre jugará un papel: ninguna de las soluciones presentadas es incorrecta, pero algunas se verán mejor para cada codificador individual.
apéndice
Esta es una solución ampliada de una anterior que publiqué. Como esa publicación seguía recibiendo atención, decidí ampliarla y referirme a las otras excelentes soluciones que se publicaron aquí. Mi publicación original tenía un comentario que mencionaba que si tenía la intención de modificar su vector dentro de un for
bucle, entonces hay dos métodos proporcionados std::vector
para acceder a los elementos: std::vector::operator[]
que no realiza la comprobación de límites y std::vector::at
que realiza la comprobación de límites. En otras palabras, at
se lanzará si intenta acceder a un elemento fuera del vector y operator[]
no lo haría. Solo agregué este comentario, originalmente, para mencionar algo que podría ser útil saber si alguien ya no lo hizo. Y no veo diferencia ahora. De ahí esta adición.