Para responder sua pergunta, você pode usar um iterador:
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Se você deseja modificar o conteúdo do vetor no loop for, use em iteratorvez deconst_iterator .
Mas há muito mais a ser dito sobre isso. Se você quer apenas uma resposta que possa usar, pode parar por aqui; caso contrário, continue a ler.
auto (C ++ 11) / typedef
Esta não é outra solução, mas um complemento para a iteratorsolução acima . Se você estiver usando o padrão C ++ 11 (ou posterior), poderá usar a autopalavra-chave para ajudar na legibilidade:
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Mas o tipo de iserá não-const (ou seja, o compilador usará std::vector<char>::iteratorcomo o tipo de i).
Nesse caso, você também pode usar um typedef(não restrito ao C ++ 11 e muito útil para usar):
typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
contador
Obviamente, você pode usar um tipo inteiro para registrar sua posição no forloop:
for(int i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
Se você fizer isso, é melhor usar os tipos de membros do contêiner, se estiverem disponíveis e adequados. std::vectorpossui um tipo de membro chamado size_typepara este trabalho: é o tipo retornado pelo sizemétodo
// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
Por que não usar isso sobre a iteratorsolução? Em casos simples, você pode também, mas o ponto é que a iteratorclasse é um objeto projetado para fazer esse trabalho em objetos mais complicados, onde essa solução não será ideal.
loop for baseado em intervalo (C ++ 11)
Veja a solução de Jefffrey . No C ++ 11 (e posterior), você pode usar o novo forloop baseado em intervalo , que se parece com isso:
for (auto i: path)
std::cout << i << ' ';
Como pathé um vetor de itens (explicitamente std::vector<char>), o objeto ié do tipo do item do vetor (ou seja, explicitamente, é do tipo char). O objeto item um valor que é uma cópia do item real no pathobjeto. Portanto, todas as alterações ino loop não são preservadas por pathsi só. Além disso, se você deseja reforçar o fato de que não deseja alterar o valor copiado ino loop, pode forçar o tipo ia ser const charassim:
for (const auto i: path)
std::cout << i << ' ';
Se você deseja modificar os itens path, pode usar uma referência:
for (auto& i: path)
std::cout << i << ' ';
e mesmo se você não quiser modificar path, se a cópia de objetos for cara, use uma referência const em vez de copiar por valor:
for (const auto& i: path)
std::cout << i << ' ';
std :: copy
Veja a resposta de Josué . Você pode usar o algoritmo STL std::copypara copiar o conteúdo do vetor no fluxo de saída. Esta é uma solução elegante se você se sentir confortável com ela (e, além disso, é muito útil, não apenas no caso de imprimir o conteúdo de um vetor).
std :: for_each
Veja a solução de Max . O uso std::for_eaché um exagero neste cenário simples, mas é uma solução muito útil se você deseja fazer mais do que apenas imprimir na tela: o uso std::for_eachpermite fazer qualquer operação (sensível) no conteúdo do vetor.
sobrecarga ostream :: operator <<
Veja a resposta de Chris , isso é mais um complemento para as outras respostas, pois você ainda precisará implementar uma das soluções acima na sobrecarga. Em seu exemplo, ele usou um contador em um forloop. Por exemplo, é assim que você pode usar rapidamente a solução 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;
}
O uso de qualquer uma das outras soluções deve ser direto.
conclusão
Qualquer uma das soluções apresentadas aqui funcionará. Depende de você e do código em qual é o "melhor". Qualquer coisa mais detalhada do que isso é provavelmente deixada para outra pergunta em que os prós / contras possam ser avaliados adequadamente; mas, como sempre, a preferência do usuário sempre desempenhará um papel: nenhuma das soluções apresentadas está errada, mas algumas parecerão mais agradáveis para cada codificador individual.
termo aditivo
Esta é uma solução expandida de uma anterior que eu publiquei. Como esse post continuava recebendo atenção, decidi expandi-lo e me referir às outras excelentes soluções que foram publicadas aqui. Meu post original teve uma observação que mencionou que se você foram a intenção de modificar o seu vector dentro de um forcircuito, em seguida, existem dois métodos fornecidos pela std::vectora elementos de acesso: std::vector::operator[]o que não fazer verificação de limites, e std::vector::atque faz executar verificação de limites. Em outras palavras, atserá lançado se você tentar acessar um elemento fora do vetor e operator[]não o faria. Apenas adicionei esse comentário, originalmente, para mencionar algo que talvez seja útil saber se alguém já não o fez. E não vejo diferença agora. Daí este adendo.