STL Containers | Vector - 1

Containerlar içinde en çok kullanılan veri yapısı olan std::vector, ardışıl bir veri yapısıdır. Yani dizinin elemanları hafızada birbirini takip ederek konumlanır. Aynı zamanda dinamik bir veri yapısıdır. Bu sayede doğrudan dizinin boyutunu büyütmemize gerek yoktur. Kendisi arka planda algoritmik olarak  dizinin boyutunu ihtiyaç oldukça arttırmaktadır.

begin(), rbegin(), end(), rend() fonksiyonlarının iteratör konumları
std::vector<T>::iterator  RandomAccessIterator türündendir. Ve RandomAccessIterator bir BidirectionalIterator olduğundan dolayı
sabit zamanda elemana erişim,
iki yönlü hareket edebilme
iteratör'ü sabit bir değerle işleme sokabilme olanağı vardır.

std::vector | İlklendirme (Initializing)

vector veri yapısı hayata getirilirken birden fazla biçimde gerçekleştirilebilir. Aşağıda 6 farklı biçimde hayata getirilmesi gösterilmiştir.

std::vector | Initializing örneği
  • 6. numaralı satır : varsayılan hayata getirme yöntemidir. ivec1 içinde eleman yoktur ama belli bir kapasitede yer ayrılmıştır.
  • 8. satır : initializer list aracılığıyla hayata geçirme yöntemidir. ivec2 içinde 5 eleman ve belli bir kapasitede yer ayrılmıştır.
  • 11. satır : uniform initialization şeklinde hayata geçirme yöntemidir. C++11 ile gelmiştir. ivec3 içinde 5 eleman ve belli bir kapasitede yer ayrılmıştır.
  • 14. satır : Başka bir vector aracığılıyla hayata geçirme biçimidir. Verilen iki iteratör'dön birincisi başlangıç, ikincisi bitiş iteratör değeri olarak [X,Y) elemanları vektöre yerleştirir.  
  • 17. satır : 3 elemanlı bir vektör oluşturur. Ve T değerinin varsayılan değeri neyse vektör onunla hayata başlar. Yukarıdaki örnekte int olduğu için 3 elemanlı ve sıfırlardan oluşan bir vektör hayata getirilir.
  • 20. satır : 17. satırdakine benzer şekilde 3 elemanlı bir vektör oluşturur. Fakat elemanlar bu sefer sıfır değil 3'ü de -1 olarak vektör hayata getirilir.

std::vector | Elemanlara Erişim (Element access)

vector veri yapısı içindeki elemanlara erişmemizi sağlayan birden fazla yöntem mevcuttur. Aşağıda tüm erişim sağlayan yöntemler görülebilir.

std::vector | element access
Yukarıdaki tüm fonksiyonları içine alan bir erişim örneği aşağıdaki gibidir:

std::vector | elemanlara erişim örneği
Burada at ile [] erişimleri arasındaki temel fark at'in std::out_of_range exception'ı fırlatmasıdır. Bu sebeple operator[] yerine at'in kullanılması daha güvenli kod yazılmasını sağlayacaktır.
Program çıktısı

std::vector | Kapasite (Capacity)

vector veri yapısının eleman sayısı/kapasite bilgilerine erişmenin ve kapasite ile ilgili direktif vermenin birden fazla yöntemi mevcuttur. Aşağıda tüm yöntemler görülebilir.

std::vector | capacity
Yukarıdaki tüm fonksiyonları içine alan bir kapasite örneği aşağıdaki gibidir:

std::vector | kapasite örneği
Yukarıdaki örnekte eleman sayısı iki katına çıkınca kapasiteninde 2 katına çıktığı görülmektedir.

Program çıktısı

std::vector | Elemanları Düzenleme (Modifiers)


vector veri yapısında eleman eklenmesi/silinmesini ya da değiştirilmesini sağlayan birden fazla yöntem mevcuttur. Aşağıda tüm yöntemler görülebilir.

std::vector | modifiers
Yukarıdaki fonksiyonları içine alan iki kapasite örneği aşağıdaki gibidir:

std::vector | elemanları düzenleme örneği - 1
Yukarıda push_back ile sondan ekleme, pop_back ile sondan silme, insert ile konum bazlı ekleme, erase ile konum bazlı silme ve aralık silme yapılmıştır.

Program çıktısı
Aşağıdaki örnekte ise yukardakine ek olarak resize ile silme, swap ile container'ları yer değiştirme, clear ile container'ı boşaltma  işlemleri yapılmıştır.

std::vector | elemanları düzenleme örneği - 2
14, 20, 24. satırlardaki container'ı ekrana yazmak için kullanılan kod parçaları tek satıra indirgemek için farklı bir formata çekilmiştir. Kodun anlaşılabilirliği açısından sıkıntılı olan bu biçimde kod yazmamaya dikkat edin.
Program çıktısı

Note:

Aşağıdaki örnek ise reserve, assign, front, back ve empty fonksiyonlarına ilişkindir.

std::vector | örneği
reserve ile istenilen kapasitede bir alan tahsis edilecek ama yer açtığı alanın içine herhangi bir ilk değer verme işlemi gerçekleştirilmeyecektir, assign ile vector içindeki değerler yenileri ile yer değiştirecek ve kapasite ona göre ayarlanacaktır, front ile ön taraftaki değeri back ile arka taraftaki değeri geri döndürür, ve empty ile container'ın boş olup olmadığı kontrolünü yapar.
Program çıktısı
Yukarıdaki örnekte ivec2 clear ile silindiği için empty çağrısı true değer döndürmüştür.