CPP 023 – std::vector

Array’lerin yakın kardeşleri. C++’ın nimetlerinden biri olan vector’lere bakacağız.

  • Boyutları sabit değildir, değişebilir bu da bize büyük bir esneklik sunuyor.
  • Temelinde array’leri kullanıyor. Çalışma esnasında istenilen boyuta göre dinamik bir şekilde yeni bir array oluşturuyor ve eski arraydeki elemanları bu yeni array’e kopyalayıp eskisini siliyor. Yani kapasitesini her artırdığında ya da azaltığında bir kopyalama işlemi yapmak mecburiyetinde kalıyor.
  • Aslında biz de vector benzeri bir yapı sınıf kodlayıp kullanabiliriz ama hali hazırda yapılmış harika bir sınıfa sahibiz.
  • vector’lerde size(boyut) ve capacity(kapasite) dediğimiz iki tane şey var. Bunlar birbirinden farklı.
    • size: o anda vector’de bulunan eleman sayısını verir. Vektöre her eleman eklediğimizde bu sayı bir artar. Çıkardığımızda bir azalır.
    • capacity: vector’un arka planda bellekte ayırdığı eleman sayısını verir. Dedik ya bellekte array’leri dinamik olarak oluşturup kopyalama yapıyor. Kopyalama işlemi pahalı bir işlem olduğu için devamlı yapmak sıkıntılı. O sebeple array tanımlarken fazladan tanımlıyor ve bunun bir kısmını kullanıyor. Ne zaman tüm alanı kullanıp daha fazlasına ihtiyaç duyulursa o zaman yeniden daha büyük bir array oluşturuyor. Bu oluşturduğu array’in boyutları da bize kapasiteyi veriyor.
#include <iostream>
#include <vector> // bunu eklememiz gerekiyor.

using namespace std;

int main() {
	vector<int> vec; 
	for (int i = 0; i < 100; i++) {
		vec.push_back(i);
		cout << "size:  " << vec.size() << "\tcapacity: " << vec.capacity() << endl;
	}
}

// size:  1        capacity : 1
// size : 2        capacity : 2
// size : 3        capacity : 3
// size : 4        capacity : 4
// size : 5        capacity : 6
// size : 6        capacity : 6
// size : 7        capacity : 9
// size : 8        capacity : 9
// size : 9        capacity : 9
// size : 10       capacity : 13
// size : 11       capacity : 13
// size : 12       capacity : 13
// size : 13       capacity : 13
// size : 14       capacity : 19
// ...
// size : 19       capacity : 19
// size : 20       capacity : 28
// ...
// size : 28       capacity : 28
// size : 29       capacity : 42
// size : 30       capacity : 42
// ...
// size : 41       capacity : 42
// size : 42       capacity : 42
// size : 43       capacity : 63
// size : 44       capacity : 63
// ...
// size : 62       capacity : 63
// size : 63       capacity : 63
// size : 64       capacity : 94
// size : 65       capacity : 94
// ...
// size : 93       capacity : 94
// size : 94       capacity : 94
// size : 95       capacity : 141
// size : 96       capacity : 141
// ...
// size : 99       capacity : 141
// size : 100      capacity : 141
// kisaltmak icin // ... kullanilmistir

Diğer bazı fonksiyonlarını içeren ufak bir örnek yapalım:

#include <iostream>
#include <vector> // bunu eklememiz gerekiyor.

using namespace std;

void print(vector<int> v) {
	for (int i = 0; i < v.size(); i++) 
		cout << v[i] << ", ";	
	cout << endl; 
}


int main() {
	vector<int> vec; 
	print(vec); // 

	vec.push_back(4);
	vec.push_back(5);
	vec.push_back(6);
	print(vec); // 4, 5, 6,

	vec.push_back(7);
	vec.push_back(8);
	vec.push_back(9);
	print(vec); // 4, 5, 6, 7, 8, 9,

	vec.pop_back();
	vec.pop_back();
	print(vec); // 4, 5, 6, 7,

	cout << vec.front() << endl; // 4
	cout << vec.back() << endl;  // 7

	vec.clear();
	print(vec); // 
}
  • push_back : arkasına eleman ekler.
  • pop_back : arkasından eleman çıkarır.
  • [] : elemana erişir.
  • .at() : elemana erişir ama bu esnada sınır kontrolü yapar.
  • clear : tüm elemanları temizler.
  • front : ilk elemanı verir.
  • back : son elemanı verir.

vector sınıfına ait fonksiyonlar bunlarla sınırlı değil diğer fonksiyonlara bir göz gezdirip ne işe yaradığını anlamaya çalışabilirsiniz.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *