"Enter"a basıp içeriğe geçin

Array ve Vector Sınıfları

Array ve vector sınıfları: ikisi de konteyner sınıflardır. Yani verileri bir arada tutmaya yararlar.
C deki dizilerin akıllanmış halleri gibidirler. Ancak fazladan veri tuttukları için hafızada normal dizilerden daha fazla yer tutarlar.
Eğer veriler bellekte birbirine yakın yerlerdeyse, bir veriyi alırken işlemci daha sonra işine yarayabileceğini düşünerek yakınındaki verileri de alır. Bu yüzden performansta artış olur.
Performans olarak Array sınıfı daha hızlıdır. Ancak vektörler daha dinamik bir yapıya sahiptir.
Hangisini kullanacağımızı ihtiyacımız belirler.
İkisini de kullanmak için std namespace’ini kullanmamız lazım. -> using namespace std;
Boyut bilgisini içlerinde tuttukları için fonksiyona yollarken boyut yollamamız gerekmez.

Şablon sınıf oldukları için içlerine herhangi bir tipte veri alabilirler. Bizim oluşturduğumuz sınıflar da dahildir.

İteratörler

Vektör ve array gibi konteyner sınıflarda iteratör denilen, genelleştirilmiş pointerlar bulunur. Standart pointer aritmatiği kullanabileceğimiz gibi, bazı özel iteratörler sayesinde farklı şeyler de yapabiliriz.

vector<int>::iterator i; diyerek bir iteratör oluşturabiliriz.
Konteyner sınıflarda begin ve end iteratörleri bulunur. Begin ilk adresi gösteren bir pointer, end ise son adresten sonraki hafıza adresini gösteren bir pointerdır. Henüz görmedik ama, aşağıdaki kalıbı kullanarak bir vektörün tüm elemanlarını dolaşabiliriz

vector<int>::iterator i; //vektör tipinde bir iteratör oluşşturduk
while(i !=vector.end() ){

cout<<*i<<endl;
i++; }

Vector sınıfı:

Template konteyner bir sınıftır. Verileri array gibi peş peşe tutar. Array’den farkı boyutuyla dinamik olarak oynanabilmesidir.
Eğer dizi için ihtiyacımız olan alanı derleme sırasında bilmiyorsak, yani programı çalıştırınca belli olacaksa vektör kullanmak mantıklıdır.
Ancak bu rahatlık performans kaybına neden olur. Ayrıca standart C tipi  dizilerden daha fazla yer kaplar (çünkü ek bilgiler tutar)

Vektörleri kullanmak için #include<vector>;  diyerek vektör kütüphanesini ekleriz.
vector<tip> isim(boyut); şeklinde tanımlarız.

Bu aslında bir constructor olur. Ama aldığı parametre bir değere atanmadığı, boyutu belirttiği için convertion constructor değildir. Tüm değerler varsayılan olarak 0’dır. Boyut belirtmezsek boş kalır.{} ile ilklendirme yapılabilir.

 

Vektörlerde boyutu farklı olan nesneler arasında eşitleme, kopyalama gibi işlemler yapılabilir.

Ör: 7 ve 10 buyutunda 2 vektörümüz olsun.                                                                                                    vektor1=vektor2;  diyerek vektor1’e vektor2’yi atayabiliriz.
vektor1’in tüm elemanları silinir ve vektor2’nin elemanları eklenmiş olur. Yani boyutu da değişmiştir. Eşitlemeden sonra vektörlerde yapılan değişiklikler birbirini etkilemez.
C tarzı dizilerde bunu yaparsak  direkt pointer yani adres atamış olurduk.  Yani aslında hafızada aynı yeri gösteren 2 dizimiz olurdu ve değişiklikler ikisini de etkilerdi. Dizilerden birini de kaybetmiş olurduk ve bellekte ölü alan kalırdı.

if(vektor1==vektor2) diyerek eşitliklerine bakabiliriz.//Boyutları farklı ise zaten direkt eşit değildir. Sonra eleman eşit olup olmadıklarına bakılır.

vector<int> vektor2{vektor1}; diyerek vektor1’i direk kopyalayarak vektor2’yi oluşturabiliriz.(copy constructor)

Vector sınıfındaki fonksiyonlar:

Array Sınıfı:

Arrays: Rastgele erişimde(dizinin herhangi bir elemanının indexini yazarak işlem yapma) vektörlerden daha hızlı çalışırlar. Ancak araya veri ekleme gibi işleri desteklemez.
İsmi, türü ve boyutu mutlaka verilmelidir. Sabit olmayan bir  değer(örneğin const olmayan bir değişken) dizi boyutu olarak atanamaz.
Dizilerdeki gibi indexler 0 dan başlar. yani ilk index [0], ikinci index [1] olur.
Array sınıfını kullanmak için include ederiz.  #include<array>
Diziler array<tip, boyut > isim;  şeklinde tanımlanır.  array<tip, boyut > isim {1,2,3};  şeklinde ilklendirilebilir. {} ile tümüne 0 atanır. static array<tip, boyut > isim; ile de tümüne 0 atayabiliriz.
Eğer ilklendirilmezsen çöp değer atanır.
İki boyutlu Array oluşturmak için  array<array<int, sütun>satır> diziadı;

 

 Array sınıfı fonksiyonları:

dizi.begin() : dizinin başlangıç konumunu iteratör olarak yollar (iteratörü daha sonra göreceğiz. Genişletirmiş bir pointerdır ve dizini bir elemanını gösterir.)

dizi.end() : dizinin son konumunu işaret eder. Dizinin son elemanından sonraki boşluğa karşılık gelir. Yani aslında dizinin bir elemanı değildir.

ör:


// Bu da dizinin ilk elemanına karşılık gelir. it++ ile sonraki elemana geçmesi sağlanır. Dizinin tüm elemanlarını yazdırdıktan sonra dizinin sonundaki boşluğa geldiği için durur.

dizi.begin()==dizi.end() ise dizi boş demektir.

dizi.size() ile : dizinin boyutunu döndürebiliriz. Çünkü sınıf size bilgisini içinde tutar. Ama bu hafızada kapladığı yer değil, eleman sayısıdır.

sizeof(dizi) ile gerçekte kapladığı alanı görebiliriz.

dizi.max_size() : dizinin mevcut durumda alabileceği maximum eleman sayısını tutar.

dizi.empty() : cout << (dizi.empty() ? “bos” : “dolu”) //dizinin boş olup olmadığını gösterir.(çöp değerler dahil)

dizi.at(i); dizinin i. elemanına ulaşmak için kullanılır. exception’da kullanılabildiği için dizide olmayan adrese ulaşım engellenmiş olur. Stl array sınıfında oluşturulan bir dizide normal dizi indexine ulaşır gibi int x=dizi[a]; kullanabiliriz. Ama diziyi bu şekilde oluşturamayız. Ayrıca hafızada erişmememiz gereken adrese erişme ihtimalimiz vardır.

dizi.front() : dizinin ilk elemanına ulaşmamızı sağlar. Ama begin gibi iteratör yollamaz. Direk elemanın referansını yollar.

dizi.back() : dizinin son elemanına ulaşmamızı sağlar. Ama end gibi iteratör yollamaz. Direk elemanın referansını yollar.

myarray.fill(5) : dizinin tüm elemanlarını 5 yapar.

dizi.swap() : aynı türe ve boyuta sahip 2 dizinin elemanlarını yer değiştirir

//artık first 11, 22, 33, 44, 55 ve second da 10, 20, 30, 40, 50 oldu.

 

Tüm fonksiyonlara bu adresten bakabilirsiniz

    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir