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:
iaadalah 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:
plsama dengan {1,2,3,4}- Array
- Loop kedua:
plsama dengan {5,6,7,8}- Array
- Loop ketiga:
plsama 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
nbilangan yang dimaksud, maka ia[n]sama dengan *(ia+n)(Kami mendereferensi alamat yang merupakan nentri maju), dan ia+nsama dengan &ia[n](Kami mendapatkan alamat dari entri itu dalam larik).
Inilah yang terjadi:
- Pada setiap loop,
pldiatur sebagai referensi untuk ia[n], dengan nmenyamai jumlah loop arus mulai dari 0. Jadi, pladalah ia[0]pada putaran pertama, pada kedua itu ia[1], dan sebagainya. Ini mengambil nilai melalui iterasi.
- Pengulangan berlangsung selama
ia+nkurang 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 autokata kunci saat membuat pl? Seperti apa kelihatannya?
Dalam contoh berikut, plmengacu pada file array of four integers. Pada setiap loop pldiberi 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 forloop '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.