C++ STL std::vector'e Bakış

Vektörler, eklenen ya da çıkarılan elemanlara göre boyutu dinamik olarak değişen bir dinamik dizidir. Bitişik dizi formunda olduğundan elemanlara erişim oldukça hızlıdır. Yeni eleman ekleme ve eleman silme durumunda ise bellekte yeni alan ayrırıp elemanları oraya taşıyarak işlem yapar. Bu yüzden ekleme ve silme işlemleri erişim işlemleri kadar hızlı değildir.

vector nesnesinin bellekte görünümü ve eleman eklendikçe oluşan değişim

std::vector Bazı Üye Fonksiyonları ve Algoritma Karmaşıklıkları


Yapıcı Fonksiyonlar

vector v; Boş vector oluşturma. O(1)
vector v(n); N elemanlı vector oluşurma. O(n)
vector v(n, value); N elemanlı vector oluşurma ve ilk değer ataması. O(n)
vector v(begin, end); Bir vector oluşturma ve öğeleri baştan sona kopyalama. O(n)

Erişim Fonksiyonları

v[i]; İndis i’deki elemanı göster/değer ata. O(1)
v.at(i); İndis i’deki elemanı göster/değer ata(sınır kontrolü ile). O(1)
v.size(); Eleman sayısını göster. O(1)
v.empty(); vector boş ise true döndür. O(1)
v.begin(); Rastgele erişim iteratörünü başa getir. O(1)
v.end(); Rastgele erişim iteratörünü sona getir. O(1)
v.front(); İlk elemanı döndürür. O(1)
v.back(); son elemanı döndürür. O(1)
v.capacity(); Maksimum eleman sayısını döndürür (Bellekte işgal edilen) O(1)

Düzenleme Fonksiyonları

v.push_back(value); value elemanını sona ekle. O(1) (amortized)
v.insert(iterator, value); value elemanını iteratörün gösterdiği yere ekle. O(n)
v.pop_back(); Sondan eleman çıkart. O(1)
v.erase(iterator); İteratörün gösterdiği elemanı sil. O(n)
v.erase(begin, end); begin ile end arasındaki tüm elemanları sil. O(n)

std::vector Oluşturma ve Eleman Ekleme

#include <vector> önişlemci direktifiyle vektör kullanmak için gerekli başlık dosyası eklenir. Ardından std::vector<typename> v; ile içerisinde typename tipinden (bu int, double, string olabilir) elemanlar barındıran vector nesnesi oluşturulur.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
// int değişkenler barındıran vector oluşturma ve ilk değer atama
std::vector<int> v = {7, 5, 16, 8};

// iki tane değer ekleme
v.push_back(25);
v.push_back(13);

// vector elemanlarını yazdır
std::for_each(v.begin(),v.end(),[](const decltype(v[0]) &a){std::cout<< a << ' ';});
}

Kod çıktısı: 7 5 16 8 25 13

std::vector Eleman Bulma, Silme ve Diğer İşlemler

Vector nesnesinde tıpkı diziler gibi döngü ile içerisinde dolaşarak istenilen eleman bulunabilir ya da değeri değiştirilebilir. Eleman silmek için ise erase(iterator) ya da yine aynı başlık dosyasında tanımlanmış ama vector sınıfına ait olmayan std::erase(std::vector, value)(C++20) fonksiyonları kullanılabilir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <vector>
#include <iostream>
#include <algorithm>


int main( )
{
std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

std::for_each(v.begin(),v.end(),[](const decltype(v[0]) &a){std::cout<< a << ' ';});
std::cout << '\n';

// ilk eleman siliniyor
v.erase(v.begin());

std::for_each(v.begin(),v.end(),[](const decltype(v[0]) &a){std::cout<< a << ' ';});
std::cout << '\n';

// cift sayilar siliniyor (C++11 ve sonrasi)
for (auto it = v.begin(); it != v.end();) {
(*it % 2 == 0) ? it = v.erase(it) : ++it;
}

std::for_each(v.begin(),v.end(),[](const decltype(v[0]) &a){std::cout<< a << ' ';});
std::cout << '\n';
}

Kod çıktısı:

1
2
3
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 3 5 7 9

Diğer std::vector Üye Fonksiyonları

  • shrink_to_fit(): Vector nesnesinden eleman silindiğinde silinen elemanların bellekte işgal ettiği alanı geri almak için kullanılır, bir nevi operator delete gibi iş görür.
  • rbegin() ve rend(): Vector nesnesinin ter çevrilmiş halinin begin() ve end() iteratörlerinin karşılığıdır. rbegin() ile end() ve rend() ile begin() aynı yerleri göstermektedir.
  • data(): Vector nesnesinin (eğer boş değilse) ilk elemanını gösteren pointer döndürür.

İleri okuma ve kaynaklar

Github Pages Hexo ile PWA ve Daha Fazlası

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×