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:
vec.begin() // 1st
vec.begin()+1 // 2nd
// ...
vec.begin()+(i-1) // ith
// ...
vec.begin()+(vec.size()-1) // last
Berikut ini adalah contoh pola akses umum (versi C ++ sebelumnya):
int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Keuntungan menggunakan iterator adalah Anda dapat menerapkan pola yang sama dengan penampung lain :
sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
sum += *it;
}
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:
sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
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):
sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
Dan, sebagai tambahan, ada yang lebih sederhana untuk setiap varian:
sum = 0;
for (auto value : vec) {
sum += value;
}
Dan terakhir ada juga di std::accumulate
mana Anda harus berhati-hati apakah Anda menambahkan bilangan bulat atau floating point.