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, iterator
yerine 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ü i
sabit değildir (yani, derleyici std::vector<char>::iterator
tü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, for
dö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
: size
yö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, iterator
sı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 i
vektö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, i
döngüdeki tüm değişiklikler kendi içinde korunmaz path
. Ayrıca, i
dö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 path
isterseniz, 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::copy
Vektö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_each
bu 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_each
yapmanı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 for
dö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 for
sonra 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::at
bağlantıda bulunduğu sınırları denetleme gerçekleştirin. Diğer bir deyişle, at
vektö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.