Diziden eleman çıkartmanın yeni ve çok daha etkin yollarını öğrendim. Bildiklerimle birlikte sıralıyorum:
- (Bunu biliyordum.) Eğer eleman en sondaysa, herhalde en kolayı uzunluğu bir azaltmaktır:
auto dizi = [ 0, 1, 2, 3 ];
--dizi.length;
assert(dizi == [ 0, 1, 2 ]);
- (Bunu biliyordum.) Eğer ortadaysa, çıkartılacak elemandan önceki ve sonraki dilimleri birleştirmek:
auto dizi = [ 0, 1, 2, 3 ];
dizi = dizi[0..1] ~ dizi[2..$];
assert(dizi == [ 0, 2, 3 ]);
- std.algorithm.remove'un ilginç özellikleri var:
-
birden fazla indeks alabiliyormuş
-
sonucu bir dönüş aralığı olarak üretiyormuş
auto dizi = [ 0, 1, 2, 3, 4, 5 ];
auto sonuç = remove(dizi, 0, 2);
assert(sonuç == [ 1, 3, 4, 5 ]);
- aldığı dizide yapısal değişiklik yapmıyormuş; elemanları kaydırarak (move) değiştiriyormuş. O yüzden asıl dizi şaşırtıcı bir durumda kalıyor:
assert(dizi == [ 1, 3, 4, 5, 4, 5 ]);
Asıl dizinin değişmesi için aradaki sonuç'u boşverip doğrudan diziye atamak gerekiyor:
auto dizi = [ 0, 1, 2, 3, 4, 5 ];
dizi = remove(dizi, 0, 2);
assert(dizi == [ 1, 3, 4, 5 ]);
- belirli bir aralıktaki elemanları çıkartmak için parametre olarak 'std.typecons.tuple' alıyor. Örneğin 1'den 3'e kadarki indeksli elemanları çıkartmak için:
auto dizi = [ 0, 1, 2, 3, 4, 5 ];
dizi = remove(dizi, tuple(1, 3)); // 1 ve 2 çıkartılır, 3 çıkartılmaz
assert(dizi == [ 0, 3, 4, 5 ]);
- Yukarıdaki yöntemler dizideki elemanların başlangıçtaki sıralarını koruyor. Bu tür algoritmalara "stable" denir. Diziden başlangıçtaki sıranın önemi olmadan (unstable) eleman çıkartıldığında işlemler daha hızlı gerçekleştirilebilir. Örneğin başka elemanların kaydırılmaları gerekmeden; sondaki eleman, çıkartılan elemanın yerine geçebilir. Bunun için remove'a SwapStrategy (değiş tokuş stratejisi) şablon parametresi de vermek gerekiyor:
auto dizi = [ 0, 1, 2, 3, 4, 5 ];
dizi = remove!(SwapStrategy.unstable)(dizi, 0);
assert(dizi == [ 5, 1, 2, 3, 4 ]);
Galiba remove'un bu kullanımı hatalı. Sıfırıncı dışındaki elemanların çıkartılması doğru sonuç vermiyor. Belgesindeki şu örnek de beklendiği gibi çalışmıyor:
int[] a = [ 0, 1, 2, 3 ];
assert(remove!(SwapStrategy.unstable)(a, 1) == [ 0, 3, 2 ]);
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]