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.


Algorithm | search, search_n

C++'da bir veri yapısı içinde arama yapmak için kullanılabilecek std::search, std::search_n algoritmalarını sırasıyla anlatmaya çalışalım.

Algorithm | search

search algoritmasının template bildirimi
std::search algoritmasının çalışma prensibi bir veri yapısı içinde başka bir veri yapısının elemanlarını ardışıl olarak arama ve bulduğunda ilk eşitliği sağlayan değerin iteratör değeri ile geri dönmesi üzerinedir. search çağrısı sırasında verilen ilk iki parametre aranılan veri yapısına ilişkin aralık belirten iteratörler, sonraki iki parametre ise aranacak veri yapısına ilişkin başlangıç - bitiş iteratör değerleridir. Ve 5. parametre olarak Binary Predicate bir callable ifade de karşılaştırma için yazılabilmektedir.

Algorithm | search örneği - 1

Yukarıdaki örnekte ivecB içinde ardışıl olarak 2, 3, 5, 7 değerleri aranır ve bulunursa indeks değeri ile geri dönmektedir. Aşağıda ise programın ekran çıktısını görebiliriz.

Örnek - 1 : Çıktı

Aşağıdaki örnekte ivecB içinde ardışıl olarak 2, 3, 5, 7 değerleri aranır ve bulunursa indeks değeri ile geri dönmektedir. Bu örnekte yukarıdakinden faklı olarak binary predicate bir lambda ifadesi yazılmıştır.

Algorithm | search örneği - 2
Aşağıda ise programın ekran çıktısını görebiliriz.

Örnek - 2 : Çıktı

Algorithm | search_n

search_n algoritmasının template bildirimi
std::search_n algoritmasının çalışma prensibi bir veri yapısı içindeki elemanların tekrar edip etmediğini arama üzerinedir. Burada minimum kaç tekrarı ve hangi elemanı tekrar ettiğini parametre olarak almaktadır. search_n çağrısı sırasında verilen ilk iki parametre aranılan veri yapısına ilişkin aralık belirten iteratörler, sonraki iki parametre ise aranacak verinin kaç kez tekrar ettiği ve hangi elemanın tekrar edip etmediği bilgisinin girildiği değerlerdir. Ve 5. parametre olarak Binary Predicate bir callable ifade de karşılaştırma için yazılabilmektedir.

Algorithm | search_n örneği - 1
Yukarıdaki örnekte 30 değerinin 2 kez tekrar ettiği noktayı ivec vektörü içinde bulmaya çalışan programı yazdık. Aşağıda ise programın ekran çıktısını görebiliriz.

Örnek - 1 : Çıktı

Aşağıdaki örnekte bir string ifade içinde . değerinin 2 kez tekrar ettiği noktayı bulmaya çalışan programı yazdık.

Algorithm | search_n örneği - 2
 Aşağıda ise programın ekran çıktısını görebiliriz.

Örnek - 2 : Çıktı