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 iterator
vez 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 iterator
solução acima . Se você estiver usando o padrão C ++ 11 (ou posterior), poderá usar a auto
palavra-chave para ajudar na legibilidade:
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Mas o tipo de i
será não-const (ou seja, o compilador usará std::vector<char>::iterator
como 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 for
loop:
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::vector
possui um tipo de membro chamado size_type
para este trabalho: é o tipo retornado pelo 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 que não usar isso sobre a iterator
solução? Em casos simples, você pode também, mas o ponto é que a iterator
classe é 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 for
loop 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 i
tem um valor que é uma cópia do item real no path
objeto. Portanto, todas as alterações i
no loop não são preservadas por path
si só. Além disso, se você deseja reforçar o fato de que não deseja alterar o valor copiado i
no loop, pode forçar o tipo i
a ser const char
assim:
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::copy
para 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_each
permite 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 for
loop. 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 for
circuito, em seguida, existem dois métodos fornecidos pela std::vector
a elementos de acesso: std::vector::operator[]
o que não fazer verificação de limites, e std::vector::at
que faz executar verificação de limites. Em outras palavras, at
será 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.