2. BLM225
Nesneye Dayalı Programlama
2
11. STL Kütüphanesi
Standart Şablon Kütüphanesi (Standart Template Library) C++ ilk çıktığında
bünyesinde yoktu. STL genel amaçlı bilinen algoritmaları, veri yapılarını
şablonlaştırılmış sınıfları ve bunlarla ilgili ihtiyaç duyulan fonksiyonları kullanıcının
hizmetine sunmaktadır.
C++ STL (Standart Şablon Kütüphanesi) programcılara kuyruklar, listeler ve
yığınlar gibi standart veri yapılarını kolayca geliştirme olanağı sağlayan, genel
amaçlı bir sınıf şablonları ve algoritmaları bütünüdür. STL kütüphanesi üç
bileÅŸene sahiptir. Bunlar :
- Konteyner (Container –içerici, kapsayıcı, kab)
- İteratörler(İterators - Yineleyiciler)
- Algoritmalar (Algorithms)
Konteyner: vektör, yığın, liste gibi şablon olarak tanımlanmış sınıflardan oluşur.
Konteynerlerın bir kısmı sıralı olarak verileri tutarlar. Bunlar sıralı konteyner
(sequence container) olarak bilinirler. Bazı konteynerlere ise rasgele erişim
mümkündür. Bunlar ilişkisel konteyner(associative container ) olarak bilinirler. C++
STL de en çok kullanılan konteynerler şu şekildedir.
Vector : Bir çeşit dinamik dizidir.
Stack : Yığın
Queue: Kuyruk
List : liste
iteratör: Konteynerler üzerinde işlem yapmak için kullanılan tanımlanmış
pointerlerdir.
Algoritmalar: Konteynerler üzerinde çalışan fonksiyonlardır. Algoritma, Konteynerler
içindeki verilere uygulanacak işlemleri tanımlar. Algoritmalar, kendi başlarına
bağımsız birer şablon olarak tanımlanmış fonksiyonlardır. STL de birçok algoritma
fonksiyon bulunmaktadır.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
2
3. BLM225
Nesneye Dayalı Programlama
3
Vector
Vectorler eleman eklendikçe boyutu ekleme esnasında artan dinamik diziler olarak
tanımlanabilir. Bu sayede bellek gereksiz yere kullanılmaz ve bellek daha randımanlı
kullanılmış olur. Normalde C++’da dizi oluştururken tanımlama esnasında dizinin
boyutunu belirtmek gerekir. Vector sınıfı sayesinde başlangıçta boyut belirtmeden
eleman eklendiğinde boyutu artan dinamik bir dizi tanımlanmış olur. Vector
kullanarak hemen hemen her tür veri tipi ya da nesneyi tutan dinamik diziler
oluşturulabilir. Vector elemanlarına [] operatörü ile random olarak erişilebilir.
Bir vector tanımlamak için vector kutphanesinin programa dahil edilmesi gerekir.
Daha sonra vector aşağıdaki gibi tanımlanabilir.
vector<veri tipi> vector ismi;
#include <vector> Vector kutuphanesi programa dahil edilir.
int n; n değişkeni int turunden tanımlandı
vector<int> v; V isimli 0 elemanlı int turunde bir vector
tanımlanır.
vector<int> v(n); V isimli n elemanlı int turunde bir vector
tanımlanır.
vector<int> v(n, 5); V isimli n elemanlı int turunde bir vector
tanımlanır. Vector un her elemanının ilk
başlangıç değeri 5 dir.
v.~vector<T>(); V vectorunun butun elemanları silinir. V
bellekten atılır.
Bir iteratör(yineleyici) tanımlama
İterator konteyner sınıfı üzerinde işlem yapmak için kullanılan göstericilerdir. Bir
iteratör tanımlamak için aşağıdaki gibi bir tanımlama yapmak gerekir.
vector<veri tipi>::iterator iteratör ismi ;
vector<T>::iterator p ; P isimli iteratör(gösterici) tanımlanır
p = v.begin(); p iteratörü V vectorunun ilk elemanı gösterir.
p = v.end(); p iteratörü V vectorunun son elemanı gösterir.
++p; P iteratörü bir sonraki elemanı gösterir
--p; P iteratörü bir önceki elemanı gösterir
int n; P iteratorun gösterdiği konteynerdeki değer n değişkenine
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
3
4. BLM225
Nesneye Dayalı Programlama
4
n=*p; atanır.
Vector konteyneri üzerinde işlem yapan fonksiyonlar
int n;
n=v.size();
V vectorundeki eleman sayısını n değişkenine atar
n=v.capacity(); V vektörünün eleman sayısı olarak kapasitesini verir.
v.size()fonsiyonunun verdiÄŸi deÄŸere eÅŸit olmayabilir.
n=v.max_size(); Vektörün tutabileceği maksimum eleman sayısını verir
bool b;
b=v.empty();
V vektörü bos ise true degil ise false dondurur
v.reserve(100); V vektörünün eleman sayısı en az 100 olarak belirlenir
v =v1; V1 vektörüne v vektörü atanır
v[i]=3;
v.at[i]=3;
Vektörün i. Elemanına 3 değeri atanır
v.front()=5;
veya v[0] = 5.
Vektörün ilk elemanına 5 değeri verilir.
v.back() = 3, veya v[v.size()-1] = 3. Vektörün son elemanına 5 değeri verilir.
v.push_back(5); Vektörün sonuna 5 değeri eklenir. Gerekliyse vektör
geniÅŸletilir
v.pop_back(); Son eleman silinir
v.clear(); Vektördeki tüm elemanlar silinir.
v.assign(n, 5); Vektördeki ilk n tane elemana 5 değerini atar. Vektörde değer
var ise bu değerler üzerine yazılır.
v.assign(bas, son);
ör:
v2.assign(v1.begin(), v1.end());
Vektördeki bas iteratöründen son iteratörüne kadar değerleri
v vektörüne atar.
p = v.insert(p, 5); P iteratöründen önce 5 değerini yerleştirir. Bu elemanın yerini
gösteren iteratör döndürür.
v.insert(p, n, 5); P iteratöründen itibaren n tane 5 değeri yerleştirir.
v.insert(p, p1, p2); P iteratöründen itibaren p1 iteratöründen p2 iteratörüne
kadar olan değerleri v vektöründe yerleştirir.
p = v.erase(p1); P1 den itibaren değerleri siler. Bir sonraki pozisyonu dönderir.
p = v.erase(p1, p2); Removes range p1..p2 and returns position of next element.
Bir sonraki pozisyonu dönderir.
int n = v[i];
n = v.at(i);
V vektöründeki i. Değeri n değişkenine atar.
n = v.front(); V vektöründeki ilk değeri n değişkenine atar
n = v.back(); V vektöründeki son değeri n değişkenine atar
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
4
5. BLM225
Nesneye Dayalı Programlama
5
Örnekler
push_back(), size(), and operatör[] fonksiyonlarına örnek
#include <conio.h>
#include <iostream>
#include <list>
#include <vector>
#include <deque>
using namespace std;
int main()
{
vector<int> v; //create a vector of ints
v.push_back(10); //put values at end of array
v.push_back(11);
v.push_back(12);
v.push_back(13);
v[0] = 20; //replace with new values
v[3] = 23;
v.push_back(25);
cout<<"capacity="<<v.capacity()<<endl;
cout<<"size="<<v.size()<<endl;
for(int j=0; j<v.size(); j++) //display vector contents
cout << v[j] <<" " ; //20 11 12 23
cout << endl;
getch();
return 0;
}
swap(), empty(), back(), and pop_back
#include <conio.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//an array of doubles
double arr[] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 };
vector<double> v1(arr, arr+5); //initialize vector to array
vector<double> v2(5); //empty vector of size 5
v1.swap(v2); //swap contents of v1 and v2
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
5
6. BLM225
Nesneye Dayalı Programlama
6
while( !v2.empty() ) //until vector is empty,
{
cout << v2.back() << " "; //display the last element
v2.pop_back(); //remove the last element
} //output: 5.5 4.4 3.3 2.2 1.1
cout << endl;
getch();
return 0;
}
#include <conio.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//an array of doubles
double arr[] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 };
vector<double> v1(arr, arr+5); //initialize vector to array
vector<double> v2(5); //empty vector of size 5
v1.swap(v2); //swap contents of v1 and v2
while( !v2.empty() ) //until vector is empty,
{
cout << v2.back() << " "; //display the last element
v2.pop_back(); //remove the last element
cout<<"capacity="<<v2.capacity()<<endl;
cout<<"size="<<v2.size()<<endl;
} //output: 5.5 4.4 3.3 2.2 1.1
cout << endl;
getch();
return 0;
}
insert() and erase()
Eleman için yer açma veya yer kapama için elemanları kaydırma işlemlerinden dolayı
vectorlerde bu fonksiyonların çalışma hızı düşüktür.
#include <conio.h>
#include <iostream>
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
6
7. BLM225
Nesneye Dayalı Programlama
7
#include <vector>
using namespace std;
int main()
{
int arr[] = { 100, 110, 120, 130, 140, 150 }; //an array of ints
vector<int> v(arr, arr+4); //initialize vector to array
cout <<"Before insertion:"<<endl;
cout <<"Size="<<v.size()<<endl;
cout <<"Capacity="<<v.capacity()<<endl;
for(int j=0; j<v.size(); j++) //display all elements
cout << v[j] <<" ";
v.insert( v.begin()+2, 115); //insert 115 at element 2
cout <<"nAfter insertion:"<<endl;
cout <<"Size="<<v.size()<<endl;
cout <<"Capacity="<<v.capacity()<<endl;
for(int j=0; j<v.size(); j++) //display all elements
cout << v[j] <<" ";
v.erase( v.begin()+2 ); //erase element 2
v.erase( v.begin()+2 ); //erase element 2
v.erase( v.begin()+2 ); //erase element 2
cout << "nAfter erasure:"<<endl;
cout <<"Size="<<v.size()<<endl;
cout <<"Capacity="<<v.capacity()<<endl;
for(int j=0; j<v.size(); j++) //display all elements
cout << v[j] << " ";
cout << endl;
getch();
return 0;
}
List
STL de bulunan List konteyneri iki bağlı bir listedir. Hem önceki hemde sonraki
elemanları gösteren pointere sahiptir. Ayrıca List konteyneri listenin hem başını
(front) hemde sonunu (last)tutan pointere sahiptir. Bu yüzden listelere hem baştan
hemde sondan erişip eleman ekleme ve çıkarma işlemleri daha hızlı bir şekilde
yapılabiir. Bu listenin avantajlı yanıdır. Diğer taraftan listenin herhangi bir elemanına
rasgele erişim yapılamaması bir dez avantajdır. Listeye liste başı tarafından erişmek
için push_front(), front(), and pop_front fonksiyonları liste sonu tarafından erişmek
için push_back(), back() ve pop_back() fonksiyonları kullanılır.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
7
8. BLM225
Nesneye Dayalı Programlama
8
push_front(), front(), and pop_front
#include <conio.h>
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> ilist;
ilist.push_back(30); //push items on back
ilist.push_back(40);
ilist.push_front(20); //push items on front
ilist.push_front(10);
int size = ilist.size(); //number of items
for(int j=0; j<size; j++) {
cout << ilist.front() <<" "; //read item from front
ilist.pop_front(); //pop item off front
}
cout<<endl;
cout<<"listenin boyutu "<<ilist.size();
cout << endl;
getch();
return 0;
}
reverse(), merge(), and unique()
// listplus.cpp
// demonstrates reverse(), merge(), and unique()
#include <conio.h>
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
8
9. BLM225
Nesneye Dayalı Programlama
9
#include <iostream>
#include <list>
using namespace std;
int main()
{
int j;
list<int> list1, list2;
int arr1[] = { 40, 30, 20, 10 };
int arr2[] = { 15, 20, 25, 30, 35 };
for(j=0; j<4; j++)
list1.push_back( arr1[j] ); //list1: 40, 30, 20, 10
for(j=0; j<5; j++)
list2.push_back( arr2[j] ); //list2: 15, 20, 25, 30, 35
cout<<"List1 size="<<list1.size()<<endl;
cout<<"List2 size="<<list2.size()<<endl;
list1.reverse(); //reverse list1: 10 20 30 40
list1.merge(list2); //merge list2 into list1
cout<<"List1 size="<<list1.size()<<endl;
cout<<"List2 size="<<list2.size()<<endl;
// list1.unique(); //remove duplicate 20 and 30
while( !list1.empty() ){
cout << list1.front() << " "; //read item from front
list1.pop_front(); //pop item off front
}
cout << endl;
getch();
return 0;
}
Deques
Deques bir yönü ile vectör diğer yönü ile list konteynerine benzer. Bir vektör gibi
elemanlarına rasgele erişime izin verir. Bir list gibi bas ve sondan erişime izin verir.
push_front(), pop_front(),front()ve push_back(), back() ve pop_back() fonksiyonları
kullanılabilir. Farklı yonu bellekde yerleşim düzenleridir. Vector de elemanlar bellekte
sıralı düzende ardışık bellek hücrelerine yerleşirken, deque de elemanların sıralı
düzende yerleşmesine gerek yoktur. Bir vektör çok buyurse bu sebepten dolayı yeni
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
9
10. BLM225
Nesneye Dayalı Programlama
10
bir eleman eklendiğinde belleğe sığmamama ve yeni bir yere taşınma durumu
olabilir. Bellekte sıralı erişim düzeninde ardışık olarak yerleşmediklerinden dolayı,
deque lerde böyle bir durum yoktur. Deque ler bir birin bitişik olmayan birkaç bölüme
yerleşebilir. Deque ler de capacity() fonksiyonuna gerek yoktur. Çünkü bu fonksiyon
vector sınıfında bir vektörün taşımaya gerek olmaksızın saklayabileceği enbüyük
eleman sayısını geri dönderir. Deque de buna gerek yoktur.
// deque.cpp
// demonstrates push_back(), push_front(), front()
#include <iostream>
#include <conio.h>
#include <deque>
using namespace std;
int main()
{
deque<int> deq;
deq.push_back(30); //push items on back
deq.push_back(40);
deq.push_back(50);
deq.push_front(20); //push items on front
deq.push_front(10);
deq[2] = 33; //change middle item
for(int j=0; j<deq.size(); j++)
cout << deq[j] << " "; //display items
cout << endl;
getch();
return 0;
}
#include <conio.h>
#include <iostream>
#include <list>
#include <vector>
#include <deque>
using namespace std;
int main ()
{
deque<int> mydeq;
deque<int>::iterator it;
// set some initial values:
for (int i=0; i<=5; ++i) mydeq.push_back(i); // 0 1 2 3 4 5
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
10
11. BLM225
Nesneye Dayalı Programlama
11
it = mydeq.begin();
++it; // it points now to number 1
mydeq[2]=22; // 0 1 22 3 4 5
mydeq.insert (it,10); // 0 10 1 22 3 4 5
mydeq.insert (it,10); // 0 10 10 1 22 3 4 5
--it; // it points now to the second 20
cout << "mydeq contains:";
for (it=mydeq.begin(); it!=mydeq.end(); ++it)
cout << ' ' << *it;
getch();
return 0;
}
Vector, List ve Deque konteynerleri şematik gösterim
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
11
12. BLM225
Nesneye Dayalı Programlama
12
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
12
13. BLM225
Nesneye Dayalı Programlama
13
iteratör kullanarak elemanlara erişim
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
#include <vector>
int main ()
{
vector<int> v;
for (int i=0; i<=5; i++)
{
v.push_back(i); // 0 1 2 3 4 5
}
cout << "myvector contains:";
vector<int>::iterator it;
it = v.begin();
it++;
for (it; it != v.end(); ++it)
cout << ' ' << *it;
cout << 'n';
getch();
return 0;
}
// listout.cpp
// iterator and for loop for output
#include <conio.h>
#include <iostream>
#include <list>
//#include <algorithm>
using namespace std;
int main()
{
int arr[] = { 2, 4, 6, 8 };
list<int> theList;
for(int k=0; k<4; k++) //fill list with array elements
theList.push_back( arr[k] );
list<int>::iterator iter; //iterator to list-of-ints
for(iter = theList.begin(); iter != theList.end(); iter++)
cout << *iter << " "; //display the list
cout << endl;
/*
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
13
14. BLM225
Nesneye Dayalı Programlama
14
iter = theList.begin();
while( iter != theList.end() )
cout << *iter++ << " ";
*/
getch();
return 0;
}
#include <conio.h>
#include <iostream>
#include <list>
#include <vector>
using namespace std;
int main ()
{
list<int> mylist;
list<int>::iterator it;
// set some initial values:
for (int i=0; i<=5; ++i) mylist.push_back(i); // 0 1 2 3 4 5
it = mylist.begin();
++it; // it points now to number 1
//mylist[2]=12; error
mylist.insert (it,10); // 0 10 1 2 3 4 5
--it; // it points now to the second 20
cout << "mylist contains:";
for (it=mylist.begin(); it!=mylist.end(); ++it)
cout << ' ' << *it;
getch();
return 0;
}
#include <conio.h>
#include <iostream>
#include <list>
#include <vector>
using namespace std;
int main ()
{
list<int> mylist;
list<int>::iterator it;
// set some initial values:
for (int i=0; i<=5; ++i) mylist.push_back(i); // 0 1 2 3 4 5
it = mylist.begin(); //(index 0)
++it; // it points now to number 1 (index 1)
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
14
15. BLM225
Nesneye Dayalı Programlama
15
//mylist[2]=12; hata!!!!!
mylist.insert (it,10); // 0 10 1 2 3 4 5 // it is still pointing number 1(index 2)
++it; //(index 3)
cout <<"iterator points " << *it<<endl; // output '2'
--it; // it points now '1!
cout <<"iterator points " << *it<<endl; // output '1'
cout << "mylist contains:";
for (it=mylist.begin(); it!=mylist.end(); ++it)
cout << ' ' << *it;
getch();
return 0;
}
Yararlanılan kaynaklar:
http://www.cplusplus.com/reference/vector/vector/
http://www.sgi.com/tech/stl/table_of_contents.html
http://msdn.microsoft.com/en-US/library/azbhc96f(v=vs.80).aspx
http://en.cppreference.com/w/cpp/container/vector
http://blog.aligoren.com/2012/03/c-stl-vector.html
#include <conio.h>
#include <iostream>
#include <list>
using namespace std;
struct agac {
int kod;
int mal;
};
class Acc {
public:
list<agac*>agaclistesi;
list<Acc*>acclist;
};
Acc * acc = new Acc();
Acc * acc1 = new Acc();
Acc * acc2 = new Acc();
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
15
16. BLM225
Nesneye Dayalı Programlama
16
int al(Acc* acc){
acc->agaclistesi.pop_back();
cout<<acc->agaclistesi.size()<<endl;
}
int main ()
{
agac * cam = new agac();
agac * kavak = new agac();
cam->kod=2;
cam->mal=5;
kavak->kod=9;
kavak->mal=25;
acc->agaclistesi.push_back(cam);
acc->agaclistesi.push_back(kavak);
acc->agaclistesi.push_back(cam);
acc->agaclistesi.push_back(kavak);
acc1->acclist.push_back(acc);
acc1->acclist.push_back(acc);
cout<<acc1->acclist.size()<<endl;
cout<< (acc1->acclist.front())->agaclistesi.size()<<endl;
acc2=acc1->acclist.front();
cout<<acc2->agaclistesi.size()<<endl;
al(acc1->acclist.front());
cout<<acc->agaclistesi.size()<<endl;
al(acc); cout<<"son"<<endl;
getch();
return 0;
}
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
16