Tujuannya adalah untuk mengakses elemen "ke-n" dari vektor string alih-alih operator [] atau metode "at". Dari apa yang saya pahami, iterator dapat digunakan untuk menavigasi kontainer, tetapi saya belum pernah menggunakan iterator sebelumnya, dan apa yang saya baca membingungkan.
Jika ada yang bisa memberi saya beberapa informasi tentang bagaimana mencapai ini, saya akan sangat menghargainya. Terima kasih.
Jawaban:
Anda perlu menggunakan metode
begin
dan kelas, yang mengembalikan iterator yang mengacu ke elemen pertama dan terakhir masing-masing.end
vector
sumber
std::vector
memiliki iterator akses acak.std::advance(it, n)
. Ini ditentukan untuk melakukan apa yang Anda inginkan, dan secara otomatis akan digunakanit + n
jika iterator diberi tag sebagai akses-acak, atau melakukan perulangan jika perlu.Biasanya, iterator digunakan untuk mengakses elemen wadah secara linier; namun, dengan "pengatur akses acak", dimungkinkan untuk mengakses elemen apa pun dengan cara yang sama seperti
operator[]
.Untuk mengakses elemen arbitrer dalam vektor
vec
, Anda dapat menggunakan berikut ini:Berikut ini adalah contoh pola akses umum (versi C ++ sebelumnya):
Keuntungan menggunakan iterator adalah Anda dapat menerapkan pola yang sama dengan penampung lain :
Karena alasan ini, sangat mudah untuk membuat kode template yang akan berfungsi sama apa pun jenis penampungnya . Keuntungan lain dari iterator adalah bahwa iterator tidak mengasumsikan data disimpan dalam memori; misalnya, seseorang dapat membuat iterator maju yang dapat membaca data dari aliran input, atau yang hanya menghasilkan data dengan cepat (misalnya generator rentang atau nomor acak).
Opsi lain menggunakan
std::for_each
dan lambda:Sejak C ++ 11 Anda dapat menggunakan
auto
untuk menghindari menentukan nama iterator yang sangat panjang dan rumit seperti yang terlihat sebelumnya (atau bahkan lebih kompleks):Dan, sebagai tambahan, ada yang lebih sederhana untuk setiap varian:
Dan terakhir ada juga di
std::accumulate
mana Anda harus berhati-hati apakah Anda menambahkan bilangan bulat atau floating point.sumber
Di C ++ - 11 Anda dapat melakukan:
Lihat di sini untuk variasi: https://en.cppreference.com/w/cpp/language/range-for
sumber
7.5.0
di Ubuntu 18.04 dan berfungsi untuk array dengan cara yang sama.Iterator vektor adalah iterator akses acak yang berarti mereka terlihat dan terasa seperti pointer biasa.
Anda dapat mengakses elemen ke-n dengan menambahkan n ke iterator yang dikembalikan dari metode penampung
begin()
, atau Anda dapat menggunakan operator[]
.Alternatifnya, Anda dapat menggunakan fungsi advance yang bekerja dengan semua jenis iterator. (Anda harus mempertimbangkan apakah Anda benar-benar ingin melakukan "akses acak" dengan iterator non-random-access, karena itu mungkin hal yang mahal untuk dilakukan.)
sumber
advance
untuk iterator akses acak, atau iterator dengan kategori tidak diketahui, karena dijamin beroperasi dalam waktu yang konstan dalam kasus tersebut. Inilah mengapa iterator yang ditentukan pengguna harus diberi tag dengan benar.advance
sangat mengganggu untuk digunakan (karena penggunaan parameter out) jika Anda tahu Anda berurusan dengan iterator akses acak. Hanya akan merekomendasikan dalam kode generik, dan jika tidak banyak digunakan (jika algoritme tidak mendukung iterator non-random-access dengan baik, biarlah - misalnya,std::sort
dapat mengurutkanstd::list
tetapi tidak karena akan sangat tidak efisien ).operator+
. Tetapi pertanyaannya secara eksplisit tentang vektor, jadi tidak ada yang salah dengan bagian pertama dari jawaban Anda. Saya hanya berpikir bagian kedua mungkin menyiratkan "Anda tidak dapat menggunakan advance dengan iterator akses acak, bahkan jika Anda ingin" kepada seseorang yang belum pernah melihatadvance
sebelumnya.Vector
harus huruf kecilBerikut adalah contoh mengakses
ith
indeks astd::vector
menggunakanstd::iterator
dalam loop yang tidak memerlukan penambahan dua iterator.Tanpa for-loop
dan menggunakan
at
metode:sumber