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 iterator
alih-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 iterator
solusi di atas . Jika Anda menggunakan standar C ++ 11 (atau lebih baru), maka Anda dapat menggunakan auto
kata kunci untuk membantu keterbacaan:
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
Tetapi tipe i
akan non-const (yaitu, kompiler akan digunakan std::vector<char>::iterator
sebagai 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 for
loop:
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::vector
memiliki tipe anggota yang dipanggil size_type
untuk pekerjaan ini: itu adalah tipe yang dikembalikan oleh size
metode.
// 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 iterator
solusinya? Untuk kasus-kasus sederhana Anda mungkin juga, tetapi intinya adalah bahwa iterator
kelas 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 for
loop berbasis rentang yang baru , yang terlihat seperti ini:
for (auto i: path)
std::cout << i << ' ';
Karena path
merupakan vektor item (secara eksplisit std::vector<char>
), objeknya i
bertipe item dari vektor (yaitu, secara eksplisit, ia bertipe char
). Objek i
memiliki nilai yang merupakan salinan dari item aktual di path
objek. Dengan demikian, semua perubahan i
pada loop tidak dipertahankan dengan path
sendirinya. Selain itu, jika Anda ingin menerapkan fakta bahwa Anda tidak ingin dapat mengubah nilai yang disalin i
dalam loop, Anda dapat memaksa tipe i
menjadi const char
seperti 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::copy
untuk 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_each
berlebihan untuk skenario sederhana ini, tetapi ini adalah solusi yang sangat berguna jika Anda ingin melakukan lebih dari sekadar mencetak ke layar: menggunakan std::for_each
memungkinkan 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 for
lingkaran. 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 for
lingkaran maka ada dua metode yang disediakan oleh std::vector
elemen akses: std::vector::operator[]
yang tidak melakukan batas memeriksa, dan std::vector::at
yang tidak melakukan batas memeriksa. Dengan kata lain, at
akan 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.