Sadece sorunuzu cevaplamak için bir yineleyici kullanabilirsiniz:
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
For döngüsünde vektörün içeriğini değiştirmek isterseniz, iteratoryerine kullanın const_iterator.
Ama bunun hakkında söylenebilecek çok şey var. Sadece kullanabileceğiniz bir cevap istiyorsanız, burada durabilirsiniz; aksi halde okumaya devam edin.
otomatik (C ++ 11) / typedef
Bu başka bir çözüm değil, yukarıdaki iteratorçözümün bir tamamlayıcısıdır . C ++ 11 standardını (veya daha yenisini) kullanıyorsanız auto, okunabilirliğe yardımcı olması için anahtar kelimeyi kullanabilirsiniz :
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Ancak türü isabit değildir (yani, derleyici std::vector<char>::iteratortürü olarak kullanır i).
Bu durumda, sadece bir typedef(C ++ 11 ile sınırlı değil ve yine de kullanmak için çok yararlı) kullanabilirsiniz:
typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
sayaç
Elbette, fordöngüdeki konumunuzu kaydetmek için bir tamsayı türü kullanabilirsiniz :
for(int i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
Bunu yapacaksanız, mevcut ve uygunsa, kabın üye türlerini kullanmak daha iyidir. bu iş için std::vectorçağrılan bir üye türüne sahiptir size_type: sizeyöntem tarafından döndürülen türdür .
// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
Neden bunu sadece iteratorçözüm üzerinde kullanmıyorsunuz ? Basit durumlar için de yapabilirsiniz, ancak nokta, iteratorsınıfın, bu çözümün ideal olmayacağı daha karmaşık nesneler için bu işi yapmak için tasarlanmış bir nesne olmasıdır.
döngü için aralık tabanlı (C ++ 11)
Jefffrey'in çözümüne bakın . C ++ 11'de (ve üstü) for, aşağıdaki gibi görünen yeni aralık tabanlı döngüyü kullanabilirsiniz :
for (auto i: path)
std::cout << i << ' ';
Yana pathöğelerin (açıkça bir vektör std::vector<char>), nesne ivektör öğenin türüne ait olduğu (yani, açıkça, bu tiptedir char). Nesnenin i, nesnedeki gerçek öğenin bir kopyası olan bir değeri vardır path. Böylece, idöngüdeki tüm değişiklikler kendi içinde korunmaz path. Ayrıca, idöngüdeki kopyalanan değerini değiştirmek istemediğiniz gerçeğini uygulamak istiyorsanız , türünü işu şekilde olmaya zorlayabilirsiniz const char:
for (const auto i: path)
std::cout << i << ' ';
İçindeki öğeleri değiştirmek pathisterseniz, bir referans kullanabilirsiniz:
for (auto& i: path)
std::cout << i << ' ';
ve değiştirmek istemeseniz bile path, nesnelerin kopyalanması pahalıysa, değere göre kopyalamak yerine bir const referansı kullanmalısınız:
for (const auto& i: path)
std::cout << i << ' ';
std :: kopya
Joshua'nın cevabına bakın . std::copyVektör içeriklerini çıkış akışına kopyalamak için STL algoritmasını kullanabilirsiniz . Bu, rahat ediyorsanız zarif bir çözümdür (ve ayrıca, sadece bir vektörün içeriğini yazdırmak için değil , çok yararlıdır).
std :: for_each
Max'in çözümüne bakın . Kullanmak std::for_eachbu basit senaryo için aşırıya kaçmaktır, ancak sadece ekrana yazdırmaktan daha fazlasını yapmak istiyorsanız çok yararlı bir çözümdür: using , vektör içerikleri üzerinde herhangi bir (mantıklı) işlem std::for_eachyapmanızı sağlar .
aşırı ostream :: operatör <<
Chris'in cevabına bakın , bu aşırı yükte yukarıdaki çözümlerden birini uygulamanız gerekeceğinden, diğer cevapların bir tamamlayıcısıdır. Örneğinde bir fordöngü içinde bir sayaç kullandı . Örneğin, Joshua'nın çözümünü bu şekilde hızlı bir şekilde kullanabilirsiniz :
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;
}
Diğer çözümlerden herhangi birinin kullanımı basit olmalıdır.
Sonuç
Burada sunulan çözümlerden herhangi biri işe yarayacaktır. Size ve "en iyi" koduna bağlıdır. Bundan daha ayrıntılı herhangi bir şey muhtemelen artılarının / eksilerin uygun şekilde değerlendirilebileceği başka bir soru için bırakılır; ancak her zamanki gibi kullanıcı tercihi her zaman bir rol oynayacaktır: sunulan çözümlerin hiçbiri yanlış değildir, ancak bazıları her bir kodlayıcı için daha hoş görünecektir.
ek
Bu, daha önce yayınladığımın genişletilmiş bir çözümüdür. Bu yazı dikkat çekmeye devam ettiğinden, onu genişletmeye ve burada yayınlanan diğer mükemmel çözümlere başvurmaya karar verdim. Benim orijinal yayın eğer bu konuda bir açıklama vardı edilmiştir bir iç vektör değiştirerek müstakbel forsonra orada tarafından sağlanan iki yöntem vardır döngü std::vector: Erişim elemanlarına std::vector::operator[]sınırları denetleme yapmaz ve std::vector::atbağlantıda bulunduğu sınırları denetleme gerçekleştirin. Diğer bir deyişle, atvektörün dışındaki bir öğeye erişmeye çalışırsanız ve atmazsanız atar operator[]. Bu yorumu sadece, daha önce kimsenin yapmadığını bilmek yararlı olabilecek bir şeyden bahsetmek için ekledim. Ve şimdi hiçbir fark görmüyorum. Dolayısıyla bu zeyilname.