Aralık tabanlı düz diziler için nasıl çalışır?
Bu, " Söyle bana bir menzilli (dizilerle) ne yapar? "
Bunu varsayarak cevaplayacağım - İç içe dizileri kullanarak aşağıdaki örneği alın:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
Metin versiyonu:
ia
[3]
her biri [4]
değerler içeren dizileri içeren bir dizi dizisidir ("iç içe dizi") . Yukarıdaki örnek ia
, birincil 'aralık' ( [3]
) ile döngü oluşturur ve bu nedenle [3]
zamanları döngüye sokar. Her bir halka bir üreten ia
bireyin [3]
içeren bir dizi - primer değerler birinci başlayan ve son ile biten [4]
değerleri.
- İlk döngü:
pl
eşittir {1,2,3,4}
- Bir dizi
- İkinci döngü:
pl
eşittir {5,6,7,8}
- Bir dizi
- Üçüncü döngü:
pl
eşittir {9,10,11,12}
- Bir dizi
Süreci açıklamadan önce, diziler hakkında bazı dostça hatırlatmalar:
- Diziler ilk değerlerine işaretçiler olarak yorumlanır - Yineleme olmadan bir dizi kullanmak ilk değerin adresini döndürür
pl
bir referans olmalı çünkü dizileri kopyalayamıyoruz
- Dizilerle, dizi nesnesinin kendisine bir sayı eklediğinizde, o kadar ileri doğru ilerler ve eşdeğer girdiyi 'işaret eder' - Söz
n
konusu sayı ise, o zaman ia[n]
şu şekilde aynıdır *(ia+n)
( n
Girişler olan adresi referans alıyoruz forward) ve ia+n
aynıdır &ia[n]
(Dizideki bu girişin adresini alıyoruz).
İşte neler oluyor:
- Her döngü,
pl
bir şekilde ayarlanır referans ile ia[n]
birlikte, n
0. So başlayarak akım döngüsü sayısını eşitlemek pl
olan ia[0]
bu kadar saniye, ilk turda ia[1]
, vb. Değeri yineleme yoluyla alır.
- Döngü
ia+n
, daha az olduğu sürece devam eder end(ia)
.
... Ve bununla ilgili.
Gerçekten bunu yazmanın basitleştirilmiş bir yolu :
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];
Diziniz varsa değil iç içe, o zaman bu işlem referans olması biraz daha basit hale gelir değil tekrarlanan değer bir dizi değil, 'normal' değeri olmadığı için, gerekli:
int ib[3] = {1,2,3};
for (auto pl : ib)
cout << pl;
for (int n = 0; n != 3; ++n)
cout << ib[n];
Bazı ek bilgiler
Ya auto
anahtar kelimeyi yaratırken kullanmak istemeseydik pl
? Bu neye benziyor?
Aşağıdaki örnekte, pl
bir array of four integers
. Her döngüde pl
şu değer verilir ia[n]
:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
Ve ... Her türlü karışıklığı ortadan kaldırmak için ek bilgilerle birlikte bu şekilde çalışır. Bu sadece for
sizin için otomatik olarak sayılan bir 'kısaltma' döngüdür, ancak mevcut döngüyü manuel olarak yapmadan geri getirmenin bir yolu yoktur.
for
. Ancak dizi bir işaretçiye dönüştüğü anda boyut bilgisi kaybolur.