sözlük üzerinde stl uygulamaları – 3

Elimizde bulunan belirli sayıda harf ile oluşturulabilecek ingilizce sözlüğümüzde yer alan tüm sözcükleri bulan bir program yazıyoruz. Örneğin sözlüğümüzde bulunan sözcüklerden “ankara” harfleriyle oluşturabileceklerimiz şunlar:

Kodumuz şöyle:

is_buildable işlevi birinci parametresine geçilen stringin (str) ikinci parametresine geçilen stringin (key) karakterleri kullanılarak elde edilip elde edilemeyeceğini sınıyor. Eğer str‘nin uzunluğu key‘in uzunluğundan fazla ise bu mümkün değil:

Arama işlemini kolaylaştırmak için key‘in karakterlerini bir multiset kabında tutuyoruz. multiset kabının aynı değere sahip öğelerden birden fazlasını tutabileceğini hatırlayalım. multiset türünden check_set nesnesini sınıfın aralık (range) parametreli kurucu işleviyle oluşturduk:

Bir aralık tabanlı for döngüsüyle (range based for loop) str stringinin tüm karakterlerini dolaşıp her bir karakterin  check_set içinde bulunup bulunmadığını test ettik. multiset sınıfının find işlevi başarsızılık durumunda aralık sonu adımlayıcısını yani check_set.end() değerini döndürüyor. find işlevinin geri dönüş değerini tutacak iter isimli değişkenin tanımlanmasında auto belirleyicisini kullandık. auto belirleyicisi olmasaydı iter değişkeni şöyle tanımlanacaktı:

Eğer aradığımız karakter check_set içinde yok ise false değeriyle geri döndük. Aradığımız karakterin bulunması durumunda  ise bu karakteri check_set‘ten sildik. İşlevin akışı for döngüsünün dışına çıkar ise str stringi key stringinin karakterleriyle olışturulabilir demektir.

main işlevinde yaptıklarımız özetle şöyle:
i)Kullanıcıdan alınacak teste konu karakterleri almak tutması için str isimli string nesnesini kullanıldı. operator>> işleviyle yapılan okumalarda boşluk karakterlerinin ayıraç olarak kullanıldığını, boşluk karakterlerinin stringe yazılmayacağını hatırlayalım.

ii) dict.txt dosyasındaki sözcükleri tutacak svec isimli bir yerel vector nesnesi olluşturduk. Bu vectorde bulunan sözcüklerden bizim koşulumuza uygun olanları bir sete kopyalayacağız. set‘in sıralama ilişkisini belirlemek için LocalPred isimli yerel bir sınıf (local class) oluşturduk. set sınıf şablonunun ikinci şablon tür parametresi olarak bu sınıfı kullanarak rset isimli bir set nesnesi yanımladık.

ii) copy_if algoritmasıyla svec vectorunde tutulan sözcüklerden koşulumuza uyanları rset setine  kopyaladık. Setimiz boş olduğu için copy_if algoritmanın setimize ekleme yapabilmesi için iterator başlık dosyasında bildirilen inserter adımlayıcı uyumlandırıcısını (iterator adaptor) kullandık. Koşulumuzu sınayan işlevin oluşturulabilmesi için, copy_if algortimasının son parametresine ise bir  lambda ifadesinden elde edilen geçici nesneyi gönderdik. lamba ifadesi yerel str stringini yakalayarak (capture) işlev içinde kullanılmasını sağladı.

iv) Aralık tabanlı for döngüsüyle setimizi dolaşarak bulunan tüm sözcükleri kullanıcı ekranına yazdırdık.

Son olarak, yazdığımız kodda kullanılan C++11 ile gelen tüm öğeleri ya da özellikleri bir listeleyelim:
uniform initializer (ilk değer vermede { } kullanımı)
auto belirleyicisi
aralık tabalı for döngüsü
lambda ifadeleri
yerel sınıf nesnelerinin algoritmalarda kullanımı

Share

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Kod Eklemek İçin Okuyun
Eklemek istediğiniz kodları lütfen aşağıdaki “pre” kodları arasında yazınız.
<pre class="lang:c++ decode:true ">
--yazacağınız kodlar--
</pre>
(buradan kopyalayarak kullanabilirsiniz)