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 iteratorlugar 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 iteratorsolución anterior . Si está utilizando el estándar C ++ 11 (o posterior), puede usar la autopalabra clave para ayudar a la legibilidad:
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Pero el tipo de iserá no constante (es decir, el compilador lo usará std::vector<char>::iteratorcomo 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 forbucle:
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::vectortiene un tipo de miembro llamado size_typepara este trabajo: es el tipo devuelto por el sizemé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 iteratorsolución? Para casos simples, también podría iteratorhacerlo , 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 forbucle basado en rango , que se ve así:
for (auto i: path)
std::cout << i << ' ';
Dado que pathes un vector de elementos (explícitamente std::vector<char>), el objeto ies del tipo del elemento del vector (es decir, explícitamente, es de tipo char). El objeto itiene un valor que es una copia del elemento real en el pathobjeto. Por lo tanto, todos los cambios ien el bucle no se conservan en pathsí mismos. Además, si desea imponer el hecho de que no desea poder cambiar el valor copiado de ien el bucle, puede forzar que el tipo de isea const charasí:
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::copypara 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_eaches 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_eachpermite 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 forbucle. 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 forbucle, entonces hay dos métodos proporcionados std::vectorpara acceder a los elementos: std::vector::operator[]que no realiza la comprobación de límites y std::vector::atque realiza la comprobación de límites. En otras palabras, atse 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.