280 likes | 510 Views
BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 9 . Sunu ) ( Yrd . Do ç . Dr. Deniz Dal). Bir Yazılımın Bileşenleri. Algoritma Veri Algoritmanın veya yazılımın işleyeceği bilgi Veri Yapısı (Data Structure )
E N D
BM-104 Nesneye Yönelik Programlama Bahar 2013 (9. Sunu) (Yrd. Doç. Dr. Deniz Dal)
Bir Yazılımın Bileşenleri • Algoritma • Veri • Algoritmanın veya yazılımın işleyeceği bilgi • Veri Yapısı (Data Structure) • Algoritmanın kullanacağı verilerin bilgisayarda etkin olarak saklanmasına ve gerektiğinde kolaylıkla işlenmesine/erişilmesine imkan tanıyan özel yapı • Yaygın Kullanılan Veri Yapılarına Örnekler: • Dizi (array), ağaç (tree), kuyruk (queue), stack (yığın) …
Standart Şablon Kütüphanesi(StandardTemplate Library – STL) • STL, programlamada sıklıkla kullanılan, her biri şablon C++ sınıfı formunda tanımlanmış bir grup veri yapısını ve bu yapılar üzerinde çalışabilen algoritmaları içeren çok etkin bir kütüphanedir. • STL 3 temel bileşenden oluşur: • Veri türünden bağımsız, dinamik olarak büyüyebilen veya küçülebilen şablon kaplar (jenerik depolayıcılar) (genericcontainers) • Kaplara uygulanabilen algoritmalar (sıralama, arama) • İteratörler (iterators) (özel pointerlar)
Veri Türünden Bağımsız Şablon Kaplar (GenericContainers) • Sıralı Şablon Kaplar (SequenceContainers) • Vector • List • Deque (DoubleEndedQueue) • İlişkili Şablon Kaplar (AssociativeContainers) • Set • Multiset • Map • Multimap • Kap Adaptörleri (Sıralı Şablon Kapların Özel Halleri) • Stack, Queue, Priority Queue
vector • #include <vector> sonrası kullanılabilirler. • Vektörler gelişmişC++dizilerigibidüşünülebilirler. C++ dizileri ile yapılan bütün işlemler şablon vector sınıfı ile de gerçekleştirilebilir. (Dinamik oluşları ise avantajlarıdır.) • Vektörler [ ] sayesinde indisli kullanıma izin verirler. • Yeni öğelerinyapınınsonunaeklendikleri(veya öğelerin yapının sonundan çıkarıldıkları)veherhangibirandaherhangibiröğeye indis vasıtasıyla rastgelehızlıcaerişimingerektiğidurumlarauygundurlar. • Yapıdaki öğelergirildiklerisırayıkoruyacakşekilde sıralı(ard arda) saklanırlar. • Vektörlerde araya öğe eklemeksona öğe eklemektençokdahapahalıbirişlemdir ve dolayısıyla bu türden işlemler vektörler kullanılarak gerçekleştirilmemelidir. http://acehreli.org/turkcecpp/topluluk_ozet.html
back() fonksiyonunun işlevi başka nasıl elde edilebilir? back, push_back, pop_back, [ ]
list • Vektörlerin öğeleri sona hızlıca eklediklerini (veya öğeleri sondan hızlıca sildiklerini) ve indis vasıtasıyla rastgele erişime izin verdiklerini söylemiştik. • Ayrıca, vektörlerde araya öğe eklemenin (veya aradan öğe silmenin) pahalı ve genellikle tercih edilmeyen bir işlem olduğunu hatırlatmıştık. • Listeler ise #include<list> sonrası kullanılabilirler, araya öğe ekleme (veya aradan öğe silme) işini hızlıca gerçekleştirirler ama rastgele erişime izin vermezler. Yani liste elemanlarına indis kullanılarak ulaşılamaz. Herhangi bir öğeye ulaşmak için o öğeden önceki öğeleri de bir iteratör yardımıyla ziyaret etmek gerekir. • STL listesi çift bağlı bir listedir. (doublylinkedlist) Yani listenin herhangi bir öğesi kendisinden önceki ve kendisinden sonraki liste öğesine bağlıdır. (Dolayısıyla bir STL listesi baştan sona doğru ve sondan başa doğru gezintiye imkan tanır.)
back, push_back, pop_back, • front, push_front, pop_front, • insert, erase insert öncesi ve sonrası it aynı öğeyi işaret eder. (Yani it öncesineekleme yapılır.)
begin, end, rbegin, rend Fonksiyonları • STL listesinin begin fonksiyonu listenin ilk öğesini işaret eden özel bir pointer (iteratör) geriye döndürür. • STL listesinin end fonksiyonu listenin son öğesinden bir sonraki pozisyonu işaret eden özel bir pointer (iteratör) geriye döndürür. • STL listesinin rbeginfonksiyonu listenin son öğesini işaret eden özel bir pointer (iteratör) geriye döndürür. (reverse) • STL listesinin rendfonksiyonu listenin ilk öğesinden bir önceki pozisyonu işaret eden özel bir pointer (iteratör) geriye döndürür.
push_front, push_back, front, back, ve insert • STL listesinin push_front, push_back, frontve backfonksiyonları aslında insert, begin, end, rbegin ve rend fonksiyonları kullanılarak elde edilebilirler. • lst.push_front(25) = insert(lst.begin(),25) • lst.push_back(25) = insert(lst.end(),25) • (lst.front()=25) = (*lst.begin()=25) • (lst.front()=25) = (*--lst.rend()=25) • (lst.back()=25) = (*--lst.end()=25) • (lst.back()=25) = (*lst.rbegin()=25)
k Bir vector Veya list İken k.end()-k.begin() deyimi acaba k.size() ile aynı sonucu üretir mi?
deque • STL kütüphanesinin deque (doubleendedqueue) (çift uçlu kuyruk) adlı veri yapısı iki uçlu bir vektör gibi düşünülebilir. Dolayısıyla yeni öğeleryapınınhem sonunave hem de başınahızlıcaeklenebilirler. (Benzer şekilde yapının hem başından ve hem de sonundan hızlıca silinebilirler.) (vector adlı STL yapısının sadece sona hızlıca ekleme yapabildiğini hatırlayınız.) • deque da vector gibi, [ ] sayesinde indisli kullanıma izin verir, yani rastgele erişim mümkündür. • deque yapısı #include <deque>sonrası kullanılabilir. • dek şeklinde okunur, kuyruk (queue) ve yığın (stack) yapılarının bir birleşimi gibi düşünülebilir.
back, push_back, pop_back, • front, push_front, pop_front, • [ ]
queue • Kuyruk (Banka kuyruğundaki müşterilerin işlem görme şekli) • First in First Out (FIFO) Stratejisi (İlk Gelen İlk Gider) • Kuyruk yapısı, bir deque yapısının sadece sona ekleme (push_back) ve baştan silme (pop_front) fonksiyonları kullanılarak elde edilebilir. • Kuyruk yapısının push adlı fonksiyonu deque yapısının push_back fonksiyonunun kendisidir. • Kuyruk yapısının popadlı fonksiyonu deque yapısının pop_frontfonksiyonunun kendisidir.
front, back, push, pop queue içerisinde gezinebilmeye izin yoktur. Böyle bir durum için deque kullanılmalıdır.
stack • Yığın (Mutfak dolabındaki tabakların diziliş ve kullanılış şekli) • Last in First Out Stratejisi (LIFO) (Son Gelen İlk Gider) • Yığın yapısı, bir deque yapısının sadece sona ekleme (push_back) ve sondan silme (pop_back) fonksiyonları kullanılarak elde edilebilir. • Yığın yapısının push adlı fonksiyonu deque yapısının push_back fonksiyonunun kendisidir. • Yığın yapısının pop adlı fonksiyonu deque yapısının pop_backfonksiyonunun kendisidir. • Yığın yapısının topadlı fonksiyonu deque yapısının backfonksiyonunun kendisidir.
Stack Kullanım Alanları • Fonksiyon Çağrılarını İşleme • Dizileri Tersine Çevirme • Sembolleri Dengeleme (Örneğin parantezlerin eşlenmesi) • RPN (ReversePolishNotation) (PostfixNotation) İşleme (RPN notasyonu paranteze ihtiyaç duymaz.) • +34 (PrefixNotation – PolishNotation) • 3+4 (InfixNotation) • 34+ (PostfixNotation – RPN Notation) • Bir zamanlar HP hesap makineleri bu mantıkla çalışıyordu.
Soru • STL’de tanımlı vector yapısını kullanarak yine STL’de tanımlı stack yapısının işlevini gerçekleştirebilir misiniz?
set • Sıralı kaplar barındırdıkları öğelere göreceli veya mutlak tamsayı pozisyon numaraları ile ulaşım imkanı tanırlar. Ayrıca, yapıdakiöğelergirildiklerisırayıkoruyacakşekildesıralı (ard arda)saklanırlar. • İlişkili kaplar ise, sıralı kapların aksine, öğelerine ulaşımı herhangi bir tipte indis anahtar (key) ile sağlarlar. Ama yapıdakiöğelergirildiklerisırayıkoruyacakşekildesıralı (ard arda)saklanmazlar. • STL kütüphanesinin set adlı bileşeni ilişkili bir kaptır ve bünyesinde benzersiz (eşsiz) (unique) ve sıralanmış (küçüklük veya büyüklük ilişkili sıralanmış) öğeler barındırır. Yani yapının içerisinde her öğeden sadece bir adet mevcuttur. set veri yapısı ikili arama ağacı (binarysearchtree) şeklinde oluşturulmuştur. • Kap öğelerine sıralama amacıyla kullanılan anahtarlarla ulaşılır ve bu anahtarlar aynı zamanda öğelerin kendileridir. (Anahtarların tipi kapta saklanan öğelerin tipi ile aynıdır.) • set kullanımına en uygunolanuygulamalar, veri yapısı öğelerinin her zamaniçinsıralıolmasıbeklenentürden uygulamalardır.
map • STL’ninmap veri yapısında her bir öğe iki parçadan oluşur: • Öğenin adı veya öğeye erişim anahtarı (indis olarak kullanılır) • Öğenin değeri • map veri yapısında set ten farklı olarak öğelerin ikinci bir bileşeni daha vardır. • map de set gibi her öğeden sadece bir adet barındırır ve öğeler yapı içerisinde anahtar bazlı sıralıdırlar. • Bir telefon fihristi uygulaması üzerinden map veri yapısının çalışma prensibi anlaşılabilir. • Bir telefon fihristinde isimler (öğelerin adları) ve isimlere karşılık gelen numaralar (öğelerin değerleri) vardır.
Ekran çıktısının anahtar bazlı artan sıralı olduğuna dikkat ediniz. Bir yılın aylarını ve her ayın kaç günden oluştuğunu bir map içerisinde nasıl saklarsınız?
İşe Uygun Aleti Kullanmalıyız(Usethe Right ToolfortheJob) • Bir tamirata (problem) başlamadan önce alet çantamızın (STL Kütüphanesi) içerisindeki elimizdeki işe (algoritma) en uygun aleti (STL içerisindeki en uygun veri yapısını) belirlemeliyiz.