bim104-sunum9

Download Report

Transcript bim104-sunum9

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
(Standard Template 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)
(generic containers)
Kaplara uygulanabilen algoritmalar (sıralama, arama)
İteratörler (iterators) (özel pointerlar)
Veri Türünden Bağımsız Şablon Kaplar
(Generic Containers)
Sıralı Şablon Kaplar (Sequence Containers)
Vector
List
Deque (Double Ended Queue)
İlişkili Şablon Kaplar (Associative Containers)
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++ dizileri gibi düşü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 öğelerin yapının sonuna eklendikleri (veya öğelerin
yapının sonundan çıkarıldıkları) ve herhangi bir anda
herhangi bir öğeye indis vasıtasıyla rastgele hızlıca erişimin
gerektiği durumlara uygundurlar.
 Yapıdaki öğeler girildikleri sırayı koruyacak şekilde sıralı
(ard arda) saklanırlar.
 Vektörlerde araya öğe eklemek sona öğe eklemekten çok
daha pahalı bir iş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, [ ]
Vektörler Saklayan Vektör
(İki Boyutlu Dinamik Dizi)
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. (doubly linked list) 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
öncesine ekleme 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 rbegin fonksiyonu listenin son öğesini işaret
eden özel bir pointer (iteratör) geriye döndürür. (reverse)
 STL listesinin rend fonksiyonu 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, front ve back
fonksiyonları 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 (double ended queue) (çift
uçlu kuyruk) adlı veri yapısı iki uçlu bir vektör gibi
düşünülebilir. Dolayısıyla yeni öğeler yapının hem
sonuna ve hem de başına hızlıca eklenebilirler. (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 pop adlı fonksiyonu deque yapısının
pop_front fonksiyonunun 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_back fonksiyonunun kendisidir.
 Yığın yapısının top adlı fonksiyonu deque yapısının
back fonksiyonunun kendisidir.
top, push, pop
Stack Kullanım Alanları
 Fonksiyon Çağrılarını İşleme
 Dizileri Tersine Çevirme
 Sembolleri Dengeleme (Örneğin parantezlerin
eşlenmesi)
 RPN (Reverse Polish Notation) (Postfix Notation)
İşleme (RPN notasyonu paranteze ihtiyaç duymaz.)
+34 (Prefix Notation – Polish Notation)
3+4 (Infix Notation)
34+ (Postfix Notation – 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
öğeler girildikleri sırayı koruyacak şekilde sı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 öğeler
girildikleri sırayı koruyacak şekilde sı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ı (binary search tree) ş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 uygun olan uygulamalar, veri yapısı öğelerinin
her zaman için sıralı olması beklenen türden uygulamalardır.
set<string> strset;
//Artan Sıralı (Ascending) String Set
set<string,less<string>> strset;
//Artan Sıralı String Set
set<string>::iterator si;
//Artan Sıralı String Set İteratör
set<string,less<string>>::iterator si;
//Artan Sıralı String Set İteratör
set<string,greater<string>> strset;
//Azalan Sıralı (Descending) String Set
set<string,greater<string>>::iterator si; //Azalan Sıralı String Set İteratör
map
 STL’nin map 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
(Use the Right Tool for the Job)
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.