Bagaimana cara kerja berbasis rentang untuk array biasa?
Apakah itu dibaca sebagai, " Katakan padaku apa yang dilakukan ranged-untuk (dengan array)? "
Saya akan menjawab dengan asumsi bahwa - Ambil contoh berikut menggunakan array bersarang:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
Versi teks:
ia
adalah larik larik ("larik bersarang"), berisi [3]
larik, dengan masing-masing berisi [4]
nilai. Contoh di atas mengulang melalui ia
'range' ( [3]
) primernya , dan oleh karena itu mengulang [3]
kali. Setiap loop menghasilkan salah satu ia
's [3]
nilai utama mulai dari yang pertama dan berakhir dengan yang terakhir - Sebuah array yang mengandung [4]
nilai-nilai.
- Loop pertama:
pl
sama dengan {1,2,3,4}
- Array
- Loop kedua:
pl
sama dengan {5,6,7,8}
- Array
- Loop ketiga:
pl
sama dengan {9,10,11,12}
- Sebuah array
Sebelum kami menjelaskan prosesnya, berikut adalah beberapa pengingat ramah tentang array:
- Array ditafsirkan sebagai penunjuk ke nilai pertamanya - Menggunakan larik tanpa iterasi apa pun mengembalikan alamat dari nilai pertama
pl
harus menjadi referensi karena kita tidak dapat menyalin array
- Dengan larik, saat Anda menambahkan angka ke objek larik itu sendiri, ia maju berkali-kali dan 'menunjuk' ke entri yang setara - Jika
n
bilangan yang dimaksud, maka ia[n]
sama dengan *(ia+n)
(Kami mendereferensi alamat yang merupakan n
entri maju), dan ia+n
sama dengan &ia[n]
(Kami mendapatkan alamat dari entri itu dalam larik).
Inilah yang terjadi:
- Pada setiap loop,
pl
diatur sebagai referensi untuk ia[n]
, dengan n
menyamai jumlah loop arus mulai dari 0. Jadi, pl
adalah ia[0]
pada putaran pertama, pada kedua itu ia[1]
, dan sebagainya. Ini mengambil nilai melalui iterasi.
- Pengulangan berlangsung selama
ia+n
kurang dari end(ia)
.
... Dan itu saja.
Ini benar-benar hanya cara yang disederhanakan untuk menulis ini :
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int n = 0; n != 3; ++n)
auto &pl = ia[n];
Jika array Anda tidak bersarang, maka proses ini menjadi sedikit lebih sederhana karena referensi tidak diperlukan, karena nilai yang diiterasi bukanlah array, melainkan nilai 'normal':
int ib[3] = {1,2,3};
for (auto pl : ib)
cout << pl;
for (int n = 0; n != 3; ++n)
cout << ib[n];
Beberapa informasi tambahan
Bagaimana jika kami tidak ingin menggunakan auto
kata kunci saat membuat pl
? Seperti apa kelihatannya?
Dalam contoh berikut, pl
mengacu pada file array of four integers
. Pada setiap loop pl
diberi nilai ia[n]
:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
Dan ... Begitulah cara kerjanya, dengan informasi tambahan untuk menghilangkan kebingungan. Ini hanya for
loop 'singkat' yang secara otomatis dihitung untuk Anda, tetapi tidak memiliki cara untuk mengambil loop saat ini tanpa melakukannya secara manual.
for
. Tapi saat array itu meluruh menjadi pointer, informasi ukuran hilang.