İki kavramı hatırlayalım:
- Dizi: Yan yana duran (ve indeksle hızlıca erişilebilen) elemanlar topluluğu. Başka bir şey değil; örneğin, olayın içinde bunların ilkini gösteren gösterge ve hatta kaç adet oldukları bile yok.
Not: Evet, sabit uzunluklu dizilerin bile uzunlukları yok; çünkü uzunluk türlerinin parçası. Yani, uzunlukları derleme zamanında bilinen bir kavram ve çalışma zamanında değişmiyor.
- Dilim: Yan yana duran elemanlara erişim sağlayan yapı; elemanların ilkini gösteren göstergeden ve eleman adedinden oluşuyor
Çoğu aralık algoritması gibi, remove() da çok kullanışlı olmak isteyen bir işlev. Bu yüzden, yalnızca dizilerle değil, kendisini BidirectionalRange olarak sunabilen her tür aralıkla kullanılabiliyor. BidirectionalRange hem başından hem de sonundan erişim sağlayan aralık demek. (Ek olarak, save() işlevi ile erişme durumunu da saklayabiliyor; yani, "save ettiğim yerden devam edeyim" diyebiliyor.)
remove() şöyle işliyor:
-
Baştan başlayayım
-
Bildirilen indekse gelince durayım
-
O indeksteki elemanı çıkartmış olmak için sonuncu elemanı onun üstüne kopyalayayım indekse yerleştireyim (Aslında bu davranışı değiştirebiliyoruz; aşağıda açıklıyorum)
-
Bir eleman eksilmiş olsun diye (ve tabii o sonuncu eleman iki kere tekrarlanmasın diye) sonuç olarak döndüreceğim aralığı son taraftan bir azaltayım
Yani, silme işlemi asıl elemanların dizi olduklarını bilmeden ve elemanları bir yerden başka yere taşıyarak gerçekleştiriliyor. Dolayısıyla, asıl elemanlar bu örnekteki gibi dizi olduklarında asıl dizide tekrarlanan elemanlar oluyor. (Bu örnekteki sondaki 9 gibi.)
Anlattığım algotirmanın bu örneğe uymadığının farkındayım çünkü ben eleman değiştirme kararınını daha kolay anlatayım diye 'SwapStrategy.unstable' olarak düşündüm. Oysa, varsayılan karar 'SwapStrategy.stable''dır. stable, elemanların sıralarının korunması, unstable ise korunmaması anlamına gelir.
unstable daha hızlı tek kopyalama yetiyor: 3 numaralı adımda sondaki elemanı belirtilen indekse kopyaladık ve işimiz bitti. stable olsaydı, belirtilen indeksten sonraki bütün elemanları teker teker bir sola kaydırmak gerekirdi. Çok daha fazla eleman kopyalardık ama sonuçta eleman sıralarını korumuş olurduk. Programcı ne istediğine karar verebiliyor. Aynı programı bir de unstable ile çalıştıralım:
writeln("5.elemanı çıkarttım ve yazdırdım..",dizitoplam.remove!(SwapStrategy.unstable)(5));
Bu sefer sondaki elemanın (yani, 9'un) belittiğimiz indekse gittiğini görüyoruz:
'
5.elemanı çıkarttım ve yazdırdım..[0, 1, 2, 3, 4, 9, 6, 7, 8]
Tekrar yazdırdım..................[0, 1, 2, 3, 4, 9, 6, 7, 8, 9]
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]