ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
KBUZEM
Karabük Üniversitesi
Uzaktan Eğitim Araştırma ve Uygulama Merkezi
11. HAFTA
NESNEYE DAYALI PROGRAMLAMA
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

More Related Content

11. stl kütüphanesi

  • 1. KBUZEM Karabük Ãœniversitesi Uzaktan EÄŸitim AraÅŸtırma ve Uygulama Merkezi 11. HAFTA NESNEYE DAYALI PROGRAMLAMA
  • 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