Iterator Vektor C++

Iterator Vektor C



Iterator utama dalam C++ adalah Iterator Input, Iterator Output, Iterator Maju, Iterator Dua Arah, dan Iterator Akses Acak. Reverse Iterator sebenarnya bukan sebuah iterator; itu adalah adaptor iterator. Ada beberapa varian iterator, seperti iterator konstan.

Iterator adalah penunjuk yang diuraikan. Seperti sebuah pointer, ia menunjuk ke objek dengan tipe yang sama di memori pada waktu yang berbeda. Semua iterator dapat direferensikan, kecuali iterator keluaran yang hanya dapat direferensikan untuk sekumpulan tipe. Dereferenceable artinya nilai yang ditunjuk oleh pointer atau iterator dapat diperoleh dengan menggunakan operator tipuan, *. Sebuah bilangan bulat dapat ditambahkan ke beberapa iterator dengan cara yang sama, dan untuk tujuan yang sama, bilangan bulat akan ditambahkan ke sebuah pointer.

Pertanyaan untuk artikel ini adalah: Apa saja iterator tersebut? Manakah dari iterator berikut yang digunakan dengan vektor C++? Bagaimana iterator ini digunakan dengan vektor C++? Artikel ini menjawab semua pertanyaan ini dengan cara yang sederhana. Di akhir artikel ini, ketika semua pertanyaan ini telah terjawab, iterator vektor C++ akan bersifat intuitif dan alami (bagi pembaca).







Isi Artikel

Ringkasan Iterator C++

Masukan Iterator



Ide dari input iterator adalah agar suatu program menerima nilai input. Berbeda dengan iterator keluaran, iterator masukan selalu dapat direferensikan. Untuk dua iterator masukan, a dan b, “a == b” tidak berarti “++a == ++b”.



Pengulang Keluaran
Ide dari iterator keluaran adalah agar suatu program melepaskan nilai keluaran. Berbeda dengan iterator masukan, iterator keluaran tidak selalu dapat direferensikan. Ini hanya dapat direferensikan untuk sekumpulan tipe.





Iterator Maju
Iterator maju dapat memindai vektor dari awal hingga akhir, satu per satu (bertambah). Ia memiliki semua persyaratan input iterator, ditambah persyaratan tambahan. Itu dapat menggantikan iterator input. Untuk dua iterator maju, a dan b, “a == b” berarti “++a == ++b”.

Iterator Dua Arah
Iterator Dua Arah dapat memindai vektor dari awal hingga akhir, satu per satu. Dari akhir ke awal, satu per satu (berkurang). Ia memiliki semua persyaratan iterator maju, ditambah persyaratan tambahan. Itu bisa menggantikan iterator maju. Untuk dua iterator dua arah, a dan b,



“a == b” berarti “++a == ++b”
Dan
“–a == –b” berarti “a == b”.

Iterator Akses Acak

Iterator Akses Acak memiliki semua persyaratan iterator dua arah, ditambah persyaratan tambahan. Itu dapat menggantikan iterator dua arah. Iterator akses acak hadir dengan keuntungan bahwa jika saat ini menunjuk ke elemen pertama dan elemen keempat diperlukan, ia akan melewati elemen kedua dan ketiga dan menunjuk ke elemen keempat. Kebalikannya melompat ke bawah adalah benar.

Iterator Terbalik

Perhatikan bahwa C++ tidak memiliki iterator terbalik yang normal karena ia memiliki iterator maju. Jadi, ada adaptor yang disebut Reverse Iterator. Ada kabar baik lainnya: iterator terbalik memenuhi semua persyaratan Iterator Dua Arah.

Iterator Konstan

Jika sebuah iterator dikatakan sebagai const iterator, elemen yang ditunjuknya tidak dapat dimodifikasi.

Konstruksi dan Akses Vektor

Container di C++ adalah: class array, deque, forward_list, list, vector, map, set, unordered_map, dan unordered_set. Vektor adalah sebuah wadah. Templat fungsi tertentu di pustaka standar C++ beroperasi dengan iterator secara langsung atau tidak langsung. Kontainer C++, serta vektor, menggunakan fungsi ini. Fungsi-fungsi ini dapat tersedia untuk program C++ dengan salah satu dari arahan penyertaan berikut:

#sertakan

atau

#termasuk

Dimasukkannya wadah lainnya juga akan menyediakan templat fungsi ini. Templat fungsi ditujukan untuk fungsi yang dapat beroperasi dengan tipe data berbeda. Vektor menggunakan iterator melalui templat fungsi ini. Beberapa template fungsi dan hubungannya dengan vektor adalah sebagai berikut:

Konstruksi

Fungsi Templat:

templat < kelas C > constexpr mobil data ( C & C ) - > tipe deklarasi ( C. data ( ) ) ;

otomatis berarti tipe pengembalian ditentukan pada evaluasi fungsi. c adalah objek kelas C.

Contoh objek vektor yang dikonstruksikan secara implisit adalah:

vektor < arang > vtr ;

Di sini objeknya, c, kosong.

Fungsi Templat:

templat < kelas DAN > constexpr konstanta DAN * data ( penginisialisasi_daftar < DAN > Itu ) tidak, kecuali ;

Di sini, E* adalah iterator yang menunjuk ke elemen pertama dari daftar atau wadah. Penggunaannya dengan vektor secara implisit adalah dengan:

vektor < arang > vtr { 'A' , 'B' , 'C' , 'D' , 'DAN' } ;
vektor < arang > :: const_iterator dia = vtr. mulai ( ) ;

Fungsi templat lebih dapat diterapkan pada pernyataan awal () (pernyataan kedua).

Mengakses

Fungsi Templat:

templat < kelas C > constexpr mobil ukuran ( konstanta C & C ) - > tipe deklarasi ( C. ukuran ( ) ) ;

Ini mengembalikan ukuran wadah. Contoh vektor:

vektor < arang > vtr { 'A' , 'B' , 'C' , 'D' , 'DAN' } ;
ke dalam N = vtr. ukuran ( ) ;
cout << N << akhir ;

Outputnya adalah 5.

Fungsi Templat:

templat < kelas DAN > [ [ tidak membuang ] ] constexpr bodoh kosong ( penginisialisasi_daftar < DAN > Itu ) tidak, kecuali ;

Mengembalikan nilai benar jika daftarnya kosong atau salah jika sebaliknya. Contoh vektor:

vektor < arang > vtr { 'A' , 'B' , 'C' , 'D' , 'DAN' } ;
bodoh dengan = vtr. kosong ( ) ;
cout << dengan << akhir ;

Outputnya adalah 0 untuk false.

Akses Jangkauan

Ada fungsi templat lainnya, yang menggunakan iterator yang digunakan vektor untuk masalah jangkauannya. Rentang adalah kumpulan elemen penampung yang berurutan.

Fungsi Templat:

templat < kelas C > constexpr mobil mulai ( C & C ) - > tipe deklarasi ( C. mulai ( ) ) ;

Ini mengembalikan sebuah iterator yang menunjuk ke elemen pertama dalam daftar. auto disini maksudnya, nilai return ditentukan pada saat evaluasi. Contoh untuk vektor:

vektor < arang > vtr { 'A' , 'B' , 'C' , 'D' , 'DAN' } ;
vektor < arang > :: iterator dia = vtr. mulai ( ) ;
cout << * dia << ' \N ' ;

Outputnya adalah A. Iterator yang dikembalikan di sini adalah iterator akses acak. Iterator akses acak konstan bisa saja dikembalikan – lihat nanti.

Templat Fungsi:

templat < kelas C > constexpr mobil akhir ( konstanta C & C ) - > tipe deklarasi ( C. akhir ( ) ) ;

Mengembalikan iterator konstan yang menunjuk ke elemen terakhir dari daftar. Kode vektor:

vektor < arang > vtr { 'A' , 'B' , 'C' , 'D' , 'DAN' } ;
vektor < arang > :: const_iterator dia = vtr. akhir ( ) ;
-- dia ;
cout << * dia << ' ' ;
-- dia ;
cout << * dia << akhir ;

Outputnya adalah “ED”. Iterator konstan dapat ditambah atau dikurangi, tetapi nilai yang ditunjuknya tidak dapat diubah. Iterator akses acak normal bisa saja dikembalikan – lihat nanti.

Templat Fungsi:

templat < kelas DAN > constexpr membalikkan_iterator < konstanta DAN * > mulai ( penginisialisasi_daftar < DAN > Itu ) ;

Mengembalikan nilai terakhir dalam daftar. rbegin() menunjuk ke elemen terakhir dari daftar dan tidak melampaui elemen terakhir dari daftar, seperti yang dilakukan end(). Contoh vektor:

vektor < arang > vtr { 'A' , 'B' , 'C' , 'D' , 'DAN' } ;
vektor < arang > :: membalikkan_iterator dia = vtr. mulai ( ) ;
cout << * dia << ' ' ;
++ dia ;
cout << * dia << akhir ;

Outputnya adalah: E D. Dengan iterator terbalik, ++ memiliki efek sebaliknya untuk iterator dua arah.

Templat Fungsi:

templat < kelas DAN > constexpr membalikkan_iterator < konstanta DAN * > membuat ( penginisialisasi_daftar < DAN > Itu ) ;

Poin tepat sebelum elemen pertama daftar. Contoh vektor:

vektor < arang > vtr { 'A' , 'B' , 'C' , 'D' , 'DAN' } ;
vektor < arang > :: membalikkan_iterator dia = vtr. membuat ( ) ;
-- dia ;
cout << * dia << ' ' ;
-- dia ;
cout << * dia << akhir ;

Outputnya adalah A B. Dengan iterator terbalik, — memiliki efek sebaliknya untuk ++ dari iterator dua arah.

Ada fungsi templat lain di bawah judul ini – lihat nanti.

Masukkan Iterator

reverse_iterator adalah adaptor iterator, bukan iterator sebenarnya. Iterator sisipan juga merupakan adaptor iterator. Ini memenuhi semua persyaratan keluaran iterator, ditambah persyaratannya sendiri. Itu ada dalam tiga bentuk di C++: back_inserter, front_inserter, dan inserter. Masing-masing memiliki konstruktornya sendiri.

kembali_masukkan:

Sisipan di belakang!
Prototipe penting:

eksplisit kembali_masukkan_iterator ( Wadah & X ) ;
kembali_masukkan_iterator & operator = ( ketik nama Wadah :: nilai_tipe && nilai ) ;

Contoh vektor:
Vektor tidak memiliki fungsi anggota penyisipan yang menyisipkan di belakang. Namun, fungsi anggota push_back(t) dapat dilihat seperti itu.

front_inserter

Sisipan di depan!
Prototipe penting:

eksplisit front_insert_iterator ( Wadah & X ) ;
front_insert_iterator & operator = ( ketik nama Wadah :: nilai_tipe && nilai ) ;

Contoh vektor:
Vektor tidak memiliki fungsi anggota penyisipan yang disisipkan di depan. Vektor juga tidak memiliki fungsi anggota push_front(t).

Kabar baiknya adalah vektor memiliki fungsi anggota penyisipan yang dapat menyisipkan di mana saja, di awal, di dalam, atau di akhir vektor.

penyisipan

Iterator ini akan menyisipkan di awal, di dalam, atau di akhir vektor.

Prototipe penting:

masukkan_iterator ( Wadah & X, ketik nama Wadah :: iterator Saya ) ;
masukkan_iterator & operator = ( ketik nama Wadah :: nilai_tipe && nilai ) ;

Contoh vektor:

vektor < arang > vtr { 'A' , 'B' , 'C' , 'D' , 'DAN' } ;
vektor < arang > :: iterator dia = vtr. mulai ( ) ;
dia = dia + 2 ;
vtr. menyisipkan ( dia, 'C' ) ;

untuk ( ke dalam Saya = 0 ; Saya < vtr. ukuran ( ) ; Saya ++ )
cout << vtr [ Saya ] << ', ' ;
cout << akhir ;

Outputnya adalah:

A, B, c, C, D, E,

Ekspresi penyisipan vektor adalah:

vtr. menyisipkan ( dia, 'C' ) ;

Itu menyisipkan elemen tepat sebelum penunjuk (itu) yang ditunjuknya.

Pindahkan Iterator

move_iterator juga merupakan adaptor iterator. Program berikut ini mirip dengan contoh yang ada pada spesifikasi C++:

#termasuk
#sertakan
#termasuk
menggunakan ruang nama std ;

ke dalam utama ( )
{
daftar < arang > bab { 'A' , 'B' , 'C' , 'D' , 'DAN' } ;
vektor < arang > vtr ( make_move_iterator ( bab. mulai ( ) ) , make_move_iterator ( bab. akhir ( ) ) ) ;

cout << 'Isi Daftar Asli:' << akhir ;
untuk ( mobil dia = bab. mulai ( ) ; dia ! = bab. akhir ( ) ; dia ++ )
cout << * dia << ', ' ;
cout << akhir << akhir ;

cout << 'Konten Vektor:' << akhir ;
untuk ( ke dalam Saya = 0 ; Saya < vtr. ukuran ( ) ; Saya ++ )
cout << vtr [ Saya ] << ', ' ;
cout << akhir ;

kembali 0 ;
}

Outputnya adalah:

Daftar asli Isi:
A, B, C, D, E,

Konten Vektor:
A, B, C, D, E,

Iterator ini mengubah nilai sumber menjadi nilai sebelum menempatkannya di tujuan.

Kesimpulan

Iterator utama dalam C++ adalah Iterator Input, Iterator Output, Iterator Maju, Iterator Dua Arah, dan Iterator Akses Acak. Pustaka standar C++ memiliki beberapa templat fungsi yang menggunakan iterator ini. Vektor menggunakan iterator ini melalui templat fungsi. Vektor memiliki beberapa nama berbeda untuk beberapa iterator ini. Ada juga adaptor iterator, yaitu: reverse_iterator, adaptor iterator, dan move_iterator. Beberapa varian iterator juga ada. Cukup dengan memasukkan ke dalam suatu program untuk memiliki semua fitur ini. Setelah memahami peran iterator, adaptor, dan templat fungsi yang menggunakannya, penggunaan iterator dengan vektor menjadi intuitif.