Subject: Küme işlemleri
std.algorithm'da aşağıdaki küme işlevleri var. Doğal olarak her tür aralıkla, örneğin dizilerle kullanılabiliyorlar. Parametre olarak iki aralık alıyorlar. Bu aralıkların sıralanmış olmaları şart.
setDifference: birinci aralıkta olan ama ikincide olmayan elemanları veriyor (fark)
setIntersection: her ikisinde de olan elemanları veriyor (kesişim)
setSymmetricDifference: yalnızca birisinde bulunan elemanları veriyor (simetrik fark)
setUnion: iki dizideki bütün elemanları veriyor (birleşim)
Bu işlevlerin dönüş türleri ağıza alınamayacak kadar karmaşık.
Örneğin setDifference'ın dönüş türü SetDifference isminde bir yapı şablonu. Onun için ya auto ile kullanmalı, ya da doğrudan aralık bekleyen başka bir işleve göndermeli...
Küçük örnek:
Çıktısı iki aralıkta da bulunan elemanları içeriyor:
Hepsini deneyen bir de gereksizce uzun
bir program yazdım:
a ve b dizilerini rastgele seçiyor. Örnek çıktı:
birinci dizi: 0 - 2 3 - 5 - 7 8 9
ikinci dizi: 0 1 2 3 4 5 6 - 8 9
setDifference: - - - - - - - 7 - -
birinci dizi: 0 - 2 3 - 5 - 7 8 9
ikinci dizi: 0 1 2 3 4 5 6 - 8 9
setIntersection: 0 - 2 3 - 5 - - 8 9
birinci dizi: 0 - 2 3 - 5 - 7 8 9
ikinci dizi: 0 1 2 3 4 5 6 - 8 9
setSymmetricDifference: - 1 - - 4 - 6 7 - -
birinci dizi: 0 - 2 3 - 5 - 7 8 9
ikinci dizi: 0 1 2 3 4 5 6 - 8 9
setUnion: 0 0 1 2 2 3 3 4 5 5 6 7 8 8 9 9
Ali
setDifference: birinci aralıkta olan ama ikincide olmayan elemanları veriyor (fark)
setIntersection: her ikisinde de olan elemanları veriyor (kesişim)
setSymmetricDifference: yalnızca birisinde bulunan elemanları veriyor (simetrik fark)
setUnion: iki dizideki bütün elemanları veriyor (birleşim)
Bu işlevlerin dönüş türleri ağıza alınamayacak kadar karmaşık.
Örneğin setDifference'ın dönüş türü SetDifference isminde bir yapı şablonu. Onun için ya auto ile kullanmalı, ya da doğrudan aralık bekleyen başka bir işleve göndermeli...Küçük örnek:
import std.stdio; import std.algorithm; void main() { writeln(setIntersection([ 0, 1, 5, 7, 10], [ 1, 2, 10 ])); }
Çıktısı iki aralıkta da bulunan elemanları içeriyor:
[1, 10]
Hepsini deneyen bir de gereksizce uzun
bir program yazdım:import std.stdio; import std.algorithm; import std.random; import std.conv; import std.algorithm; import std.string; immutable sayı_sınırı = 10; int[] sıralı_sayılar() { int[] sonuç; foreach (sayı; 0 .. sayı_sınırı) { // %75 olasılıkla ekle; %25 olasılıkla atla if (uniform(0, 4) > 0) { sonuç ~= sayı; } } return sonuç; } void boşluklu_göster(Aralık)(const dchar[] isim, Aralık sayılar) { string isim_düzeni = "\n%25s: "; string sayı_düzeni = "%3s"; writef(isim_düzeni, isim); // Verilen aralıktaki sayıların yerini boş gösterir void boş_göster(int baş, int son) { foreach (ara_sayı; baş .. son) { writef(sayı_düzeni, "-"); // boş anlamında "-" } } int boş_baş = 0; // boş gösterilecek sayıların başı foreach (sayı; sayılar) { boş_göster(boş_baş, sayı); boş_baş = sayı + 1; writef(sayı_düzeni, sayı); } // Dizide bulunmayan sondaki sayıları boş gösterelim boş_göster(boş_baş, sayı_sınırı); } // İşlevin isminin parametre listesinden önceki kısmını döndürür dstring işlev_ismi(alias işlev)() { string tam_isim = işlev.stringof; auto parametre_listesi = std.algorithm.find(tam_isim, '('); return dtext(tam_isim[0 .. $ - parametre_listesi.length]); } void işlem(alias işlev)(const int[] a, const int[] b) { boşluklu_göster("birinci dizi", a); boşluklu_göster("ikinci dizi", b); auto sonuç = işlev(a, b); boşluklu_göster(işlev_ismi!işlev, sonuç); writeln(); } void main() { const int[] a = sıralı_sayılar(); const int[] b = sıralı_sayılar(); // Birincide olan ama ikincide olmayan elemanlar işlem!setDifference(a, b); // Her ikisinde de olan elemanlar işlem!setIntersection(a, b); // Yalnızca birisinde bulunan elemanlar işlem!setSymmetricDifference(a, b); // İki dizideki bütün elemanlar işlem!setUnion(a, b); }
a ve b dizilerini rastgele seçiyor. Örnek çıktı:
birinci dizi: 0 - 2 3 - 5 - 7 8 9
ikinci dizi: 0 1 2 3 4 5 6 - 8 9
setDifference: - - - - - - - 7 - -
birinci dizi: 0 - 2 3 - 5 - 7 8 9
ikinci dizi: 0 1 2 3 4 5 6 - 8 9
setIntersection: 0 - 2 3 - 5 - - 8 9
birinci dizi: 0 - 2 3 - 5 - 7 8 9
ikinci dizi: 0 1 2 3 4 5 6 - 8 9
setSymmetricDifference: - 1 - - 4 - 6 7 - -
birinci dizi: 0 - 2 3 - 5 - 7 8 9
ikinci dizi: 0 1 2 3 4 5 6 - 8 9
setUnion: 0 0 1 2 2 3 3 4 5 5 6 7 8 8 9 9
Ali
acehreli
Show profile
Link to this post