Ana sayfa > Programlama > C++ Programlama > Vektörler

Vektörler

► Detaylı anlatım

Vektörler hakkında

Konteynerlerin içinde genel amaçlı kullanımda ileri çıkan vektördür. Vektör sınıfı, ihtiyaç duyulduğunda boyutları artan dinamik dizileri destekler. C++'da bir dizinin boyutu derleme zamanında sabit hale getirilir. Bu uygulama, dizileri kullanmanın en verimli yolu olsa da, çalışma zamanında dizinin boyutu, değişen ihtiyaca göre ayarlanamadığından, esneklik konusunda yeterli değildir. Bir vektör, ihtiyaç duyulan belleği ayırarak bu sorunu çözer.

Vektörler, boyutları değişebilen dizileri temsil eden sıralı konteynerlerdir.Tıpkı diziler gibi, vektörler de elemanları için bitişik depolama konumlarını kullanır. Ancak dizilerden farklı olarak, depolama alanları konteyner tarafından otomatik olarak işleme tutulduğundan, boyutları dinamik olarak değişebilir.

Vektörler, boyutu değiştirebilen sıralı konteynerlerdir. Konteyner, aynı türdeki verileri tutan nesnelerdir. Sıra konteynerleri, öğeleri kesinlikle doğrusal sırayla depolar.

Vektörler tıpkı diziler gibi tek bir veri türü ile tanımlanabilir.

Bir vektör için şablon bildiriminin genel yapısı aşağıda gösterilmektedir:

template <class T, allocator<T>> class vector

T: Kaydedilen veri türünü gösterir.

allocator: Tahsis ediciyi ifade eder.


template <class T, allocator<T>> class vector

T: Kaydedilen veri türünü gösterir.

allocator: Tahsis ediciyi ifade eder.

Vector konteyneri aşağıdaki constructor fonksiyonlarını içerir:

explicit vector(const Allocator &a = Allocator());

explicit vector(size_type num, const T &val = T(), const Allocator &a = Allocator());

vector(const vector<T, Allocator> &nes);

template <class InIter> vector(InIter start, InIter end, const Allocator &a = Allocator());

İlk yapı boş bir vektör oluşturur. İkinci yapı, val değerine sahip num kadar elemanlı bir vektör oluşturur. Üçüncü yapı, nes nesnesi ile aynı elemanları içeren bir vektör oluşturur. Dördüncü yapı, start ve end tekrarlayıcıları ile gösterilen aralıktaki elemanları içeren bir vektör oluşturur.

Azami esneklik ve taşınabilirlik amacıyla, bir vektöre depolanacak herhangi bir nesne, varsayılan bir constructor fonksiyonu tanımlamalıdır. Aynı zamanda, < ve == işlemlerini de tanımlamalıdır.

Bir vektör bildirimi ile örnekler aşağıda yer almaktadır:


vector<int> iv;           // Sıfır uzunluğunda int vektör oluşturma
vector<char> cv(10);      // 10 elemanlı char vektör oluşturma
vector<char> cv(10, 'x'); // İlk değer atayarak 10 elemanlı char vektör oluşturma
vector<int> iv2(iv);      // Bir int vektörden int bir vektör oluşturma

Aşağıdaki işlemciler vektörlerle birlikte kullanılabilir:

==, <, <=, !=, >, >=, [ ]

Vektör konteyneri içinde tanımlanan bazı üye fonksiyonlar aşağıdaki tabloda yer almaktadır:

Üye fonksiyon Açıklama
reference back();
const_reference back() const;
Vektördeki son elemanın referansını geri döndürür.
iterator begin();
const_iterator begin() const;
Vektördeki ilk elemanı gösteren bir tekrarlayıcı geri döndürür.
void clear(); Vektördeki tüm elemanları siler.
bool empty() const; Eğer çağıran vektör boş ise doğru, aksi takdirde yanlış bir değer geri döndürür.
iterator end();
const_iterator end() const;
Vektörün sonunu gösteren bir tekrarlayıcı geri döndürür.
iterator erase(iterator i); i ile gösterilen elemanı siler.
Silinen elemandan sonraki elemanı gösteren bir tekrarlayıcı geri döndürür.
iterator erase(iterator start, iterator end); start ile end arasındaki elemanları siler.
Silinen en son elemandan sonraki elemanı gösteren bir tekrarlayıcı geri döndürür.
reference front();
const_reference front() const;
Vektördeki ilk elemanı gösteren bir referans geri döndürür.
iterator insert(iterator i, const T &val); i ile gösterilen elemandan hemen önce val değerini ekler.
Elemanı gösteren bir tekrarlayıcı geri döndürür.
void insert(iterator i, size_type num, const T &val) i ile gösterilen elemandan hemen önce num değeri kadar val değerini ekler.
template void insert(iterator i, InIter start, InIter end); i ile gösterilen elemandan önce start ve end ile gösterilen sırayı ekler.
reference operator[ ](size_type i) const;
const_reference operator[ ](size_type i) const;
i ile gösterilen elemanın referansını geri döndürür.
void pop_back(); Vektördeki son elemanı siler.
void push_back(const T &val); val ile gösterilen değeri vektörün sonuna ekler.
size_type size() const; Vektördeki elemanların sayısını geri döndürür.

Vektör ve dizilerin karşılaştırılması

Çalışma zamanında eleman sayısını artırma veya azaltma işlemlerine ihtiyaç duyulmadığında, vektörler ve diziler aynı amaçla kullanılabilirler. Dizi ve vektör elemanlarına erişim [ ] işlemcisiyle veya diziler için işaretçiler yoluyla vektörler için ise işaretçilere benzer mantıkla çalışan tekrarlayıcılar yoluyla yapılabilir.

Bir vektör bildirimi ile normal bir dizi bildiriminin birlikte ele alındığı bir örneği incelemeye çalışalım:


#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
  vector<int> iv(10); // 10 elemanlı bir int vektör bildirimi yapar.
  int idizi[10];
  int id;

  // iv vektörünün eleman sayısını yazar.
  cout << "iv vektör eleman sayısı: " << iv.size() << endl;

  // idizi dizisinin eleman sayısını yazar.
  int numElem = sizeof(idizi)/sizeof(idizi[0]); // Dizi eleman sayısı
  cout << "idizi dizi eleman sayısı: " << numElem << endl;

  // Vektör ve diziye değer atama işlemi
  for(id=0; id<10; id++) {
      iv[id] = id+1;
      idizi[id] = id+1;
  }

  // Vektör içeriğini ekrana yazma
  cout << "Vektör içeriği: ";
  for(id=0; id<(int)iv.size(); id++) cout << iv[id] << " ";

  cout << endl;

  // Dizi içeriğini ekrana yazma
  cout << "Dizi içeriği: ";
  for(id=0; id<numElem; id++) cout << idizi[id] << " ";

  return 0;
}

Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:

iv vektör eleman sayısı: 10
idizi dizi eleman sayısı: 10
Vektör içeriği: 1 2 3 4 5 6 7 8 9 10 
Dizi içeriği: 1 2 3 4 5 6 7 8 9 10 

Program, 10'ar elemanlı bir int vektör ile bir int dizi bildirimi yapar. Vektörün eleman sayısını size() fonksiyonu ile dizinin boyutunu ise sizeof() işlemcisi ile dizinin boyutunu tek biri dizi elemanının boyutuna bölüp bularak, ekrana yazar. Bir for döngüsü içinde 1-10 arasındaki sayıları vektör ve diziye indeksleme ile atar. Vektör eleman değerleri ile dizi eleman değerlerini birer for döngüsü kullanarak ekrana yazar.

Çalışma zamanında eleman ekleyerek vektör boyutunu değiştirme

Vektörlerin en önemli özelliği, çalışma zamanında eleman eklenerek vektör boyutunu değiştirilebilmesidir. Bu özellik sayesinde programda ihtiyaç duyulan boyutlara uygun olarak esneklik sağlanmaktadır.

Şimdi, bu özelliği bir örnek üzerinde incelemeye çalışalım:


#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
  vector<int> iv(10); // 10 elemanlı bir int vektör bildirimi yapar.
  int id;

  // iv vektörünün eleman sayısını yazar.
  cout << "iv vektör eleman sayısı: " << iv.size() << endl;

  // Vektöre değer atama işlemi
  for(id=0; id<10; id++) iv[id] = id+1;

  // Vektör içeriğini ekrana yazma
  cout << "Vektör içeriği: ";
  for(id=0; id<(int)iv.size(); id++) cout << iv[id] << " ";

  cout << endl;

  // Vektöre yeni değerlerler atayarak eleman sayısını artırma
  for(id=iv.size(); id<20; id++) iv.push_back(id+1);

  // iv vektörünün eleman sayısını yazar.
  cout << "iv vektör eleman sayısı: " << iv.size() << endl;

  // Vektör içeriğini ekrana yazma
  cout << "Vektör içeriği: ";
  for(id=0; id<(int)iv.size(); id++) cout << iv[id] << " ";

  return 0;
}

Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:

iv vektör eleman sayısı: 10
Vektör içeriği: 1 2 3 4 5 6 7 8 9 10 
iv vektör eleman sayısı: 20
Vektör içeriği: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

Program, 10 elemanlı bir int vektör bildirimi yapar. Vektörün eleman sayısını size() fonksiyonu ile ekrana yazar. Bir for döngüsü içinde 1-10 arasındaki sayıları vektöre atar. Vektör eleman değerlerini bir for döngüsü kullanarak ekrana yazar. Sonra, push_back() fonksiyonu ile 11-12 arasındaki sayıları bir for döngüsü ile vektörün sonuna ekler. Vektörün eleman sayısını ve içeriğini tekrar ekrana yazar.