Bagikan melalui


Iterator

Iterator adalah objek yang dapat melakukan iterasi atas elemen dalam kontainer Pustaka Standar C++ dan menyediakan akses ke elemen individual. Kontainer Pustaka Standar C++ semuanya menyediakan iterator sehingga algoritma dapat mengakses elemennya dengan cara standar tanpa harus khawatir dengan jenis kontainer tempat elemen disimpan.

Anda dapat menggunakan iterator secara eksplisit menggunakan fungsi anggota dan global seperti begin() dan end() dan operator seperti ++ dan -- untuk bergerak maju atau mundur. Anda juga dapat menggunakan iterator secara implisit dengan rentang untuk perulangan atau (untuk beberapa jenis iterator) operator []subskrip .

Di Pustaka Standar C++, awal urutan atau rentang adalah elemen pertama. Akhir urutan atau rentang selalu didefinisikan sebagai satu melewati elemen terakhir. Fungsi begin global dan end mengembalikan iterator ke kontainer tertentu. Perulangan iterator eksplisit khas atas semua elemen dalam kontainer terlihat seperti ini:

vector<int> vec{ 0,1,2,3,4 };
for (auto it = begin(vec); it != end(vec); it++)
{
    // Access element using dereference operator
    cout << *it << " ";
}

Hal yang sama dapat dicapai lebih sederhana dengan rentang untuk perulangan:

for (auto num : vec)
{
    // no dereference operator
    cout << num << " ";
}

Ada lima kategori iterator. Untuk meningkatkan daya, kategorinya adalah:

  • Output. Iterator X output dapat mengulangi urutan dengan menggunakan ++ operator, dan hanya dapat menulis elemen sekali, dengan menggunakan * operator.

  • Input. Iterator X input dapat mengulangi urutan dengan menggunakan ++ operator, dan dapat membaca elemen berapa kali dengan menggunakan * operator. Anda dapat membandingkan iterator input dengan menggunakan == operator dan != . Setelah Anda menaikkan salinan iterator input apa pun, tidak ada salinan lain yang dapat dengan aman dibandingkan, didereferensikan, atau bertahap setelahnya.

  • Teruskan. Iterator Xpenerusan dapat mengulangi urutan menggunakan operator ++ dan dapat membaca elemen apa pun atau menulis elemen non-const berapa kali dengan menggunakan * operator. Anda dapat mengakses anggota elemen dengan menggunakan -> operator dan membandingkan iterator penerusan dengan menggunakan == operator dan != . Anda dapat membuat beberapa salinan iterator ke depan, yang masing-masing dapat didereferensikan dan ditahapkan secara independen. Iterator penerusan yang diinisialisasi tanpa referensi ke kontainer apa pun disebut iterator null forward. Iterator null forward selalu membandingkan sama.

  • Dua arah. Iterator X dua arah dapat menggantikan iterator ke depan. Namun, Anda juga dapat mengurangi iterator dua arah, seperti dalam --X, X--, atau (V = *X--). Anda dapat mengakses anggota elemen dan membandingkan iterator dua arah dengan cara yang sama seperti iterator penerusan.

  • Akses acak. Iterator X akses acak dapat menggantikan iterator dua arah. Dengan iterator akses acak, Anda dapat menggunakan operator [] subskrip untuk mengakses elemen. Anda dapat menggunakan +operator , -, += dan -= untuk bergerak maju atau mundur sejumlah elemen tertentu dan untuk menghitung jarak antara iterator. Anda dapat membandingkan iterator dua arah dengan menggunakan ==, , !=, ><, <=, dan >=.

Semua iterator dapat ditetapkan atau disalin. Mereka diasumsikan sebagai objek ringan dan sering diteruskan dan dikembalikan oleh nilai, bukan dengan referensi. Perhatikan juga bahwa tidak ada operasi yang dijelaskan sebelumnya yang dapat melemparkan pengecualian saat dilakukan pada iterator yang valid.

Hierarki kategori iterator dapat dirangkum dengan menunjukkan tiga urutan. Untuk akses tulis-saja ke urutan, Anda dapat menggunakan salah satu dari:

iterator output
-> meneruskan iterator
-> iterator dua arah
-> iterator akses acak

Panah kanan berarti "dapat diganti dengan." Algoritma apa pun yang memanggil iterator output harus bekerja dengan baik dengan iterator penerusan, misalnya, tetapi bukan sebaliknya.

Untuk akses baca-saja ke urutan, Anda dapat menggunakan salah satu dari:

iterator input
-> meneruskan iterator
-> iterator dua arah
-> iterator akses acak

Iterator input adalah yang terlemah dari semua kategori, dalam hal ini.

Terakhir, untuk akses baca/tulis ke urutan, Anda dapat menggunakan salah satu dari:

meneruskan iterator
-> iterator dua arah
-> iterator akses acak

Penunjuk objek selalu dapat berfungsi sebagai iterator akses acak, sehingga dapat berfungsi sebagai kategori iterator apa pun jika mendukung akses baca/tulis yang tepat ke urutan yang ditunjuknya.

Iterator Iterator selain penunjuk objek juga harus menentukan jenis anggota yang diperlukan oleh spesialisasi iterator_traits<Iterator>. Persyaratan ini dapat dipenuhi dengan berasal Iterator dari iterator kelas dasar publik.

Penting untuk memahami janji dan batasan setiap kategori iterator untuk melihat bagaimana iterator digunakan oleh kontainer dan algoritma di Pustaka Standar C++.

Catatan

Anda dapat menghindari penggunaan iterator secara eksplisit dengan menggunakan rentang untuk perulangan. Untuk informasi selengkapnya, lihat Berbasis rentang untuk pernyataan.

Microsoft C++ sekarang menawarkan iterator yang diperiksa dan iterator debug untuk memastikan bahwa Anda tidak menimpa batas kontainer Anda. Untuk informasi selengkapnya, lihat Memeriksa Iterator dan Debug Dukungan Iterator.

Baca juga

Referensi pustaka standar C++
Keamanan utas di Pustaka Standar C++