C++ STL Containers

Paylaş

C++ STL kütüphanesi içerisinde yer alan list, vector, stack, queue gibi taşıyıcıların kullanımı çeşitli örneklerle yer alıyor.

C++ STL containers nedir?

C++ STL içerisinde yer alan containers veya taşıyıcılar bilgisayar bilimlerinde yığın, liste, dinamik dizi, sabit dizi gibi saklama yöntemlerine göre verileri saklayan yapılardır.

STL taşıyıcılar Generic programlama yöntemine göre yazıldığından tür bağımsızdır.

Yani bu taşıyıcılar int, char, double, string gibi veri türleri içinde kullanılabilir.

C++ STL içerisinde yer alan bu taşıyıcılar, verilerin saklanış biçimine, verilere erişime göre çeşitli gruplara ayrılır.

  1. Sıralı taşıyıcılar
    1. array
    2. vector
    3. deque
    4. list
    5. forward_list
  2. İlişkili taşıyıcılar
    1. set
    2. map
    3. multiset
    4. multimap
  3. Sırasız ilişkili taşıyıcılar
    1. unordered_set
    2. unordered_map
    3. unordered_multiset
    4. unordered_multimap
  4. Özel taşıyıcılar
    1. stack
    2. queue
    3. priority_queue

Sıralı taşıyıcılar

Verilere sırayla erişilebilen taşıyıcılardır.

1. array

Sabit boyutlu dizi taşıyıcısıdır.

Klasik dizi tanımından farklı olarak dizi boyutu, dizi doldurma ve STL içerisindeki algoritmalarda kullanmaya imkan verir.

#include <iostream>
#include <array>
#include <algorithm>

using namespace std;

int main()
{
  array<int, 3> sayilar = {10, 20, 30};

  cout << "Size: " << sayilar.size() << endl;

  for (auto mevcut : sayilar)
  {
    cout << mevcut << endl;
  }

  // sayilar.fill(0);
  reverse(sayilar.begin(), sayilar.end());

  for (auto mevcut : sayilar)
  {
    cout << mevcut << endl;
  }

  return 0;
}

2. vector

Dinamik boyutlu dizi taşıyıcısıdır.

C++ STL içerisinde en fazla kullanılan ve performansı en yüksek olan taşıyıcıdır.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
  vector<string> kisiler;
  kisiler.push_back("Yusuf");
  kisiler.push_back("Ramazan");
  kisiler.push_back("Sinan");
  kisiler.push_back("Mehmet");
  kisiler.push_back("Yusuf Sefa");

  cout << "Capacity: " << kisiler.capacity() << endl;
  cout << "Size: " << kisiler.size() << endl;
  kisiler.resize(10);
  // kisiler.erase(kisiler.begin(), kisiler.end());
  cout << "Size: " << kisiler.size() << endl;

  return 0;
}

Vector taşıyıcısında kapasite C Dinamik Diziler yazısında bahsedildiği gibi ikiye katlanarak çoğalır.

3. deque

Yapısı vektör taşıyıcısına benzer, vektör taşıyıcısından farkı taşıyıcının hem önüne hemde sonuna veri eklenebiliyor ve alınabiliyor olmasıdır.

#include <iostream>
#include <deque>

using namespace std;

int main()
{
  deque<string> kisiler;
  kisiler.push_front("Yusuf");  // Liste başı
  kisiler.push_back("Ramazan"); // Liste sonu
  kisiler.push_front("Sinan");
  kisiler.push_back("Mehmet");
  kisiler.push_back("Yusuf Sefa");

  // cout << kisiler.max_size() << endl;
  cout << "Size: " << kisiler.size() << endl;
  kisiler.resize(10);
  // kisiler.erase(kisiler.begin(), kisiler.end());
  cout << "Size: " << kisiler.size() << endl;

  return 0;
}

4. list

Veriler çift bağlantılı liste biçiminde saklanır.

Verilere erişmek için liste başından başlanılması gerekir.

#include <iostream>
#include <list>

using namespace std;

int main()
{
  list<int> sayilar = {1, 1, 10, 6, 8, 5, 5};

  sayilar.unique();
  sayilar.reverse();
  // sayilar.sort();

  for (auto mevcut : sayilar)
  {
    cout << mevcut << ", ";
  }

  return 0;
}

5. forward_list

Veriler tek bağlantılı liste biçiminde saklanır.

Veri taşıyıcının başına eklenir.

#include <iostream>
#include <forward_list>

using namespace std;

int main()
{
  forward_list<int> sayilar = {1, 1, 10, 6, 8, 5, 5};
  sayilar.push_front(247); // Taşıyıcı başına eklendi.

  sayilar.unique();
  sayilar.reverse(); // Taşıyıcı ters çevrildi.
  // sayilar.sort();

  for (auto mevcut : sayilar)
  {
    cout << mevcut << ", ";
  }

  return 0;
}

İlişkili taşıyıcılar

Verileri anahtar:değer çifti olarak saklayan taşıyıcılardır.

1. set

Verileri benzersiz ve sıralı olarak saklar.

Taşıyıcıya sadece veri eklenebilir veya silinebilir ancak düzenleme yapılamaz.

Taşıyıcı Binary Search algoritmasını kullanarak işlem yapar.

#include <iostream>
#include <set>

using namespace std;

int main()
{
  set<string> kisiler{"Yusuf", "Sefa", "Sefa", "Sezer"};

  for (auto mevcut : kisiler)
    cout << mevcut << ", ";

  return 0;
}

2. map

Verileri benzersiz anahtar ile sıralı olarak saklar.

#include <iostream>
#include <map>

using namespace std;

int main()
{
  map<int, string> kisiler;
  kisiler.insert({5, "Sezer"});
  kisiler[1] = "Sefa";
  kisiler.insert(pair<int, string>(0, "Yusuf"));

  // cout << kisiler.size();
  for (auto mevcut : kisiler)
    cout << mevcut.first << " -> " << mevcut.second << endl;

  cout << kisiler[0];

  return 0;
}

Anahtarın değeri farklı veri türüden de olabilir.

#include <iostream>
#include <map>

using namespace std;

int main()
{
  map<string, string> kisiler;
  kisiler.insert({"soyadi", "Sezer"});
  kisiler["orta_adi"] = "Sefa";
  kisiler.insert(pair<string, string>("adi", "Yusuf"));

  // cout << kisiler.size();
  for (auto mevcut : kisiler)
    cout << mevcut.first << " -> " << mevcut.second << endl;

  cout << kisiler["adi"];

  return 0;
}

3. multiset

set veri yapısıyla aynı özelliği taşır.

set veri yapısından farkı aynı değerin eklenebiliyor olmasıdır.

#include <iostream>
#include <set>

using namespace std;

int main()
{
  multiset<string> kisiler{"Yusuf", "Sefa", "Sefa", "Sezer"};

  for (auto mevcut : kisiler)
    cout << mevcut << ", ";

  return 0;
}

4. multimap

map veri yapısıyla aynı özelliği taşır.

map veri yapısından farkı aynı değerin eklenebiliyor olmasıdır.

Ayrıca bu taşıyıcı içerisindeki verilere at fonksiyonu ve [] operatörü ile erişim sağlanamamaktadır.

#include <iostream>
#include <map>

using namespace std;

int main()
{
  multimap<int, string> kisiler;
  kisiler.insert({5, "Sezer"});
  kisiler.insert({5, "SEzer"});
  // kisiler[1] = "Sefa";  // hata verir
  kisiler.insert(pair<int, string>(0, "Yusuf"));

  // cout << kisiler.size();
  for (auto mevcut : kisiler)
    cout << mevcut.first << " -> " << mevcut.second << endl;

  // cout << kisiler.at(0);  // hata verir

  return 0;
}

Sırasız ilişkili taşıyıcılar

Sırasız ilişkili taşıyıcılar içerisinde yer alan unordered_set, unordered_map, unordered_multiset, unordered_multimap taşıyıcıları set, map, multiset ve multimap özelliği ile benzer özelliğe sahiptir.

Aralarındaki tek fark bu grup içerisinde yer alan taşıyıcılara veriler sıralanmadan ekleniyor olmasıdır.

Özel taşıyıcılar

Bu grupta yer alan taşıyıcılar sıralı taşıyıcıları kullanarak çeşitli veri saklama yöntemine göre verileri saklar ve erişir.

1. stack

Verileri yığın olarak saklar.

Verilere erişim LIFO Last In First OUT yani son giren ilk çıkar biçiminde olur.

Bu taşıyıcı verileri saklamak için deque sıralı taşıyıcısını kullanılır.

#include <iostream>
#include <stack>

using namespace std;

int main()
{
  stack<string> kisiler;
  kisiler.push("Yusuf");
  kisiler.push("Ramazan");
  kisiler.push("Sinan");
  kisiler.push("Mehmet");

  // cout << kisiler.size() << endl; // 4
  while (!kisiler.empty())
  {
    cout << kisiler.top() << ", ";
    kisiler.pop();
  }
  // cout << kisiler.size() << endl; // ?

  return 0;
}

2. queue

Verileri kuyruk olarak saklar.

Verilere erişim FIFO First In First OUT yani ilk giren ilk çıkar biçiminde olur.

Bu taşıyıcı verileri saklamak için deque sıralı taşıyıcısını kullanılır.

#include <iostream>
#include <queue>

using namespace std;

int main()
{
  queue<string> kisiler;
  kisiler.push("Yusuf");
  kisiler.push("Ramazan");
  kisiler.push("Sinan");
  kisiler.push("Mehmet");

  // cout << kisiler.size() << endl; // 4
  while (!kisiler.empty())
  {
    cout << kisiler.front() << ", ";
    kisiler.pop();
  }
  // cout << kisiler.size() << endl; // ?

  return 0;
}

3. priority_queue

Verileri sıralı kuyruk olarak saklar.

Bu taşıyıcı verileri saklamak için deque  ve vector sıralı taşıyıcısını kullanılır.

Verileri veri türüne göre sıralanır.

#include <iostream>
#include <queue>

using namespace std;

int main()
{
  priority_queue<string> kisiler;
  kisiler.push("Yusuf");
  kisiler.push("Ramazan");
  kisiler.push("Sinan");
  kisiler.push("Mehmet");

  // cout << kisiler.size() << endl; // 4
  while (!kisiler.empty())
  {
    cout << kisiler.top() << ", ";
    kisiler.pop();
  }
  // cout << kisiler.size() << endl; // ?

  return 0;
}

Diğer taşıyıcılar

C++ STL içerisinde yer alan ve sadece özel amaçlı olarak kullanılan pair, tuple, bitset gibi taşıyıcı olarak adlandırılmayan yapılar yer alır.

Bu yapılar özel verileri saklamak için kullanılır.

Örneğin; Pair veri yapısı map veri yapının her bir elemanı gibi anahtar:değer çifti olarak veri saklamayı sağlar.

Benzer şekilde bitset veri yapısı bitsel verileri saklamak için kullanılır.

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
  bitset<8> b;

  cout << b << endl;
  b.flip(2);
  // b.set();
  cout << b << endl;
  cout << b.to_ullong() << endl;

  return 0;
}

C++ STL içerisinde yer alan taşıyıcıların kullanımı standart olduklarından, zaman ve verilerin güvenliği açısından faydalı olacaktır.

Hayırlı günler dilerim.


Bunlarda ilgini çekebilir


Destek almak için tıklayın.