Murni untuk menjawab pertanyaan Anda, Anda dapat menggunakan iterator:
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Jika Anda ingin memodifikasi konten vektor dalam for for loop, maka gunakan iteratoralih-alih const_iterator.
Tapi ada banyak lagi yang bisa dikatakan tentang ini. Jika Anda hanya ingin jawaban yang dapat Anda gunakan, maka Anda bisa berhenti di sini; kalau tidak, baca terus.
otomatis (C ++ 11) / typedef
Ini bukan solusi lain, tetapi suplemen untuk iteratorsolusi di atas . Jika Anda menggunakan standar C ++ 11 (atau lebih baru), maka Anda dapat menggunakan autokata kunci untuk membantu keterbacaan:
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Tetapi tipe iakan non-const (yaitu, kompiler akan digunakan std::vector<char>::iteratorsebagai tipe i).
Dalam hal ini, Anda mungkin hanya menggunakan a typedef(tidak terbatas pada C ++ 11, dan sangat berguna untuk digunakan):
typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
melawan
Anda tentu saja dapat menggunakan tipe integer untuk merekam posisi Anda dalam forloop:
for(int i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
Jika Anda akan melakukan ini, lebih baik menggunakan tipe anggota penampung, jika tersedia dan sesuai. std::vectormemiliki tipe anggota yang dipanggil size_typeuntuk pekerjaan ini: itu adalah tipe yang dikembalikan oleh sizemetode.
// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
Mengapa tidak menggunakan ini saja di atas iteratorsolusinya? Untuk kasus-kasus sederhana Anda mungkin juga, tetapi intinya adalah bahwa iteratorkelas adalah objek yang dirancang untuk melakukan pekerjaan ini untuk objek yang lebih rumit di mana solusi ini tidak ideal.
berbasis rentang untuk loop (C ++ 11)
Lihat solusi Jefffrey . Di C ++ 11 (dan lebih baru) Anda bisa menggunakan forloop berbasis rentang yang baru , yang terlihat seperti ini:
for (auto i: path)
std::cout << i << ' ';
Karena pathmerupakan vektor item (secara eksplisit std::vector<char>), objeknya ibertipe item dari vektor (yaitu, secara eksplisit, ia bertipe char). Objek imemiliki nilai yang merupakan salinan dari item aktual di pathobjek. Dengan demikian, semua perubahan ipada loop tidak dipertahankan dengan pathsendirinya. Selain itu, jika Anda ingin menerapkan fakta bahwa Anda tidak ingin dapat mengubah nilai yang disalin idalam loop, Anda dapat memaksa tipe imenjadi const charseperti ini:
for (const auto i: path)
std::cout << i << ' ';
Jika Anda ingin mengubah item dalam path, Anda dapat menggunakan referensi:
for (auto& i: path)
std::cout << i << ' ';
dan bahkan jika Anda tidak ingin memodifikasi path, jika menyalin objek mahal, Anda harus menggunakan referensi const daripada menyalin dengan nilai:
for (const auto& i: path)
std::cout << i << ' ';
std :: copy
Lihat jawaban Yosua . Anda dapat menggunakan algoritma STL std::copyuntuk menyalin konten vektor ke aliran output. Ini adalah solusi yang elegan jika Anda merasa nyaman dengan itu (dan selain itu, ini sangat berguna, tidak hanya dalam hal ini mencetak isi vektor).
std :: for_each
Lihat solusi Max . Menggunakan std::for_eachberlebihan untuk skenario sederhana ini, tetapi ini adalah solusi yang sangat berguna jika Anda ingin melakukan lebih dari sekadar mencetak ke layar: menggunakan std::for_eachmemungkinkan Anda untuk melakukan operasi (masuk akal) apa pun pada konten vektor.
overload ostream :: operator <<
Lihat jawaban Chris , ini lebih melengkapi jawaban lain karena Anda masih perlu menerapkan salah satu solusi di atas dalam kelebihan beban. Dalam contohnya dia menggunakan penghitung dalam satu forlingkaran. Sebagai contoh, ini adalah bagaimana Anda dapat dengan cepat menggunakan solusi 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;
}
Penggunaan salah satu solusi lain harus langsung.
kesimpulan
Salah satu solusi yang disajikan di sini akan berfungsi. Terserah Anda dan kode mana yang "terbaik". Apa pun yang lebih terperinci dari ini mungkin sebaiknya ditanyakan pada masalah lain di mana pro / kontra dapat dievaluasi dengan benar; tetapi seperti biasa preferensi pengguna akan selalu berperan: tidak ada solusi yang disajikan salah, tetapi beberapa akan terlihat lebih bagus untuk masing-masing pembuat kode.
tambahan
Ini adalah solusi diperluas dari yang sebelumnya saya posting. Karena posting itu terus mendapat perhatian, saya memutuskan untuk mengembangkannya dan merujuk ke solusi hebat lainnya yang diposting di sini. Posting asli saya memiliki komentar yang menyebutkan bahwa jika Anda sedang berniat pada memodifikasi vektor Anda di dalam forlingkaran maka ada dua metode yang disediakan oleh std::vectorelemen akses: std::vector::operator[]yang tidak melakukan batas memeriksa, dan std::vector::atyang tidak melakukan batas memeriksa. Dengan kata lain, atakan melempar jika Anda mencoba mengakses elemen di luar vektor dan operator[]tidak mau. Saya hanya menambahkan komentar ini, awalnya, demi menyebutkan sesuatu yang mungkin perlu diketahui jika ada orang yang tidak. Dan saya tidak melihat perbedaan sekarang. Karena itu tambahan ini.