Yükleniyor...

C++ list ve deque ile Sıralı Veri Yapıları

C++ std::list ve std::deque kullanımını öğrenin. Sıralı veri yapıları, performans farkları ve kullanım senaryoları örneklerle anlatılıyor.

C++’taki std::list ve std::deque, std::vector’a alternatif olarak belirli durumlarda daha verimli davranan sıralı veri yapılarıdır. std::list, çift bağlı liste (doubly linked list) yapısı sunarken; std::deque, iki uçlu kuyruk (double-ended queue) olarak hem başa hem sona hızlı ekleme/silme imkanı sağlar. Bu makalede hangi durumda hangisinin kullanılacağı ve performans özellikleri örneklerle anlatılmaktadır.


1) std::list Nedir?

std::list, çift yönlü bağlı liste yapısıdır:


#include <list>
#include <iostream>
using namespace std;

int main() {
    list<int> lst = {10, 20, 30};

    lst.push_front(5);   // başa ekleme
    lst.push_back(40);   // sona ekleme

    auto it = lst.begin(); 
    advance(it, 2);      // 2 adım ileri git
    lst.insert(it, 25);  // araya ekleme

    for (int x : lst) cout << x << " ";
}

Kullanım Alanı: Liste içinde sık sık araya ekleme/silme işlemleri yapılıyorsa (özellikle ortada).


2) std::list Performans Özellikleri


// list üzerinde sıralama
list<int> lst = {5, 2, 9, 1};
lst.sort();      // kendi sort algoritması vardır

3) std::deque Nedir?

std::deque (double-ended queue), hem başta hem sonda hızlı ekleme/silme yapabilen dinamik bir yapıdır.


#include <deque>
#include <iostream>
using namespace std;

int main() {
    deque<int> dq = {10, 20, 30};

    dq.push_front(5);    // başa hızlı ekleme
    dq.push_back(40);    // sona hızlı ekleme

    dq.pop_front();
    dq.pop_back();

    cout << dq[0] << endl;   // rastgele erişim mümkün
}

Kullanım Alanı: Hem başa hem sona sık ekleme/silme ihtiyacı varsa.


4) std::deque Performans Özellikleri


5) list ve deque Karşılaştırması

Özelliklistdeque
Rastgele erişim Yok Var (O(1))
Başa hızlı ekleme O(1) O(1)
Sona hızlı ekleme O(1) O(1)
Ortaya ekleme O(1) O(n)
Bellek yapısı Dağınık düğümler Segmentli bloklar
Genel amaç Orta ekleme/silme çok olan durumlar Baştan ve sondan hızlı işlem gerektiren yapılar

6) Uygulamalı Örnek: Kuyruk ve İş Listesi

a) deque ile görev kuyruğu (task queue)


#include <deque>
#include <iostream>
using namespace std;

int main() {
    deque<string> tasks;

    tasks.push_back("Download");
    tasks.push_back("Parse");
    tasks.push_front("Init"); // öncelikli görev

    while (!tasks.empty()) {
        cout << "Görev: " << tasks.front() << endl;
        tasks.pop_front();
    }
}

b) list ile oyun sahnesi nesne yönetimi

Oyun motorlarında sahnedeki nesneler sık sık eklenip çıkarıldığı için list tercih edilir.


#include <list>
#include <iostream>
using namespace std;

struct Entity {
    string name;
    Entity(string n) : name(n) {}
};

int main() {
    list<Entity> entities;

    entities.emplace_back("Player");
    entities.emplace_back("Enemy");
    entities.emplace_back("Tree");

    // Düşman yok edildi
    for (auto it = entities.begin(); it != entities.end(); ) {
        if (it->name == "Enemy")
            it = entities.erase(it); // O(1)
        else
            ++it;
    }

    for (auto& e : entities)
        cout << e.name << endl;
}

7) Hangi Durumda Hangisi?

Yani genel öneri: Önce vector düşünün; sonra ihtiyaç varsa deque veya list’e geçin.


8) TL;DR

  • list: çift bağlı liste → orta ekleme/silme O(1), rastgele erişim yok.
  • deque: iki uçlu kuyruk → baş/son O(1), rastgele erişim var.
  • deque, vector kadar bitişik değil; list düğümleri daha maliyetli.
  • Kod içinde performans farkını anlamanın en iyi yolu profil oluşturmadır.
  • Tüm örnekler Visual Studio 2022 ve GCC 11+ ile uyumludur.

İlişkili Makaleler