Veri Yapıları ve STL

Veri Yapıları ve STL

Veri yapıları, programlama dünyasında verilerin düzenli ve erişilebilir şekilde organize edilmesine yardımcı olan bir yapıdır STL, C++ programlama dilinde bulunan bir standart şablon kütüphanesidir ve konteynerlar, iteratorler ve algoritmler gibi üç temel bileşeni içerir Diziler, programlama dillerinde sıklıkla kullanılan veri yapılarından biridir ve çok boyutlu diziler sayesinde daha kompleks verileri işlemek mümkündür Çok boyutlu diziler, tek boyutlu dizilere benzer şekilde tanımlanan elemanlardan oluşur ve internet üzerindeki örümcek ağlarına benzeyen bir düzenlemede saklanır

Veri Yapıları ve STL

Veri yapıları, bilgisayar programlama dünyasında verilerin organize edilmesini sağlayan bir yapıdır. Bu yapılar, programların verileri daha düzenli ve erişilebilir hale getirmesine yardımcı olur. STL veya Standard Template Library, C++ programlama dilinde bulunan bir kütüphanedir. Bu kütüphane, programcılara veri yapılarını oluşturma ve kullanma aşamasında yardımcı olur.

STL ile birçok veri yapısı oluşturulabilir. Bu veri yapıları arasında sıralı veri yapıları, bağlı listeler, yığınlar ve kuyruklar gibi veriler yer alır. Ayrıca çok boyutlu diziler ve jagged diziler gibi veri yapıları da STL ile oluşturulabilir. Her veri yapısının kendine özgü avantajları ve değerleri vardır.


STL Nedir?

STL, Standart Şablon Kütüphanesi'nin kısaltmasıdır ve C++ programlama dilinde bulunan bir kütüphanedir. Bu kütüphane, sık kullanılan veri yapılarının ve algorithm'lerin standart bir şekilde sunulmasına izin vererek, C++ dilinde yazılan kodların daha kolay ve okunaklı hale getirilmesini sağlamaktadır.

STL, üç temel bileşen içerir: konteynerlar, iteratorler ve algoritmler. Konteynerlar, verileri saklamak için kullanılır ve STL'de vector, list, deque, set, map, stack ve queue gibi birçok farklı konteyner türü bulunmaktadır. Iteratorler, bir konteynerdeki verileri işlemek için kullanılır ve algoritmler, veri işleme işlevleri sağlar.

STL'nin kullanım alanları oldukça geniştir ve programlama dünyasında oldukça yaygındır. STL, yazılım geliştiricilerinin kod yazma süresini kısaltarak, programlarının daha etkili ve verimli bir şekilde çalışmasını sağlar. Bunun yanı sıra, bellek yönetimi ve hata kontrolü gibi zorlukları da ortadan kaldırarak, yazılımcılara daha az zaman harcama imkanı sağlar.

  • STL, C++ programlama dilindeki standart kodlama stilini izler ve bu sayede kodun daha okunaklı ve anlaşılır olmasını sağlar.
  • Veri yapılarının standart bir şekilde sunulması, yazılım geliştiricilerinin veri yapılarını elle yeniden yazma ihtiyacını ortadan kaldırır.
  • STL, bellek yönetimi ve hata kontrolü gibi zorlukları ortadan kaldırarak, yazılımcılara daha az zaman harcama imkanı sağlar.
  • Fonksiyon ve class template'leri, yazılımcıların kodlarını daha hızlı bir şekilde yazmasına olanak tanır.

STL, gerek sıralı gerekse de sırasız veri yapılarını standart bir şekilde sunarak, yazılım geliştiricilerin gereksiz yere zaman kaybetmesini engeller ve kod yazma süresini kısaltarak, üretkenliği arttırır.


Diziler

Diziler, programlama dillerinde sıklıkla kullanılan veri yapılarından biridir. Dizi, aynı tipteki değerlerin, bir değişken içinde saklanmasını sağlar. Diziler, değişkenlerin belirli bir sırayla depolanması için kullanılır ve bir dizi elemanının çağrılması, belirli bir indeks değeri sayesinde gerçekleştirilir.

En basit haliyle bir dizi, bir kaç elemandan oluşabilir ve tüm elemanlar belirli bir tipte olur. Fakat dizi türleri arasında farklılıklar vardır. Örneğin çok boyutlu diziler, birinci boyut dışındaki tüm indislerin sabit kalması koşuluyla tanımlanır.

Dizi Türü Tanımı Kullanım Alanları
1D Diziler Birinci boyutu olan basit diziler. Basit veri depolama ve işleme işlemleri.
2D Diziler İki boyutlu diziler. Matris işlemleri ve sayısal veri analizi.
Çok Boyutlu Diziler İki boyutlu dizi türünden daha fazla boyuta sahip diziler. Resim işleme ve simülasyonlar.

Ayrıca, jagged diziler de mevcuttur. Bu tür diziler, her bir elemanın farklı bir uzunluğa sahip olabileceği dizilerdir. İki boyutlu dizilerde olduğu gibi, satırların sayısı sabit olmaz ve her satır farklı bir uzunlukta olabilir.

Diziler, verilerin depolanması ve erişimi için faydalı bir araçtır. Veri türleri ve boyutları, belirli bir görevi yerine getirmek için optimize edilmiştir. Türleri arasında farklılıklar olsa da, diziler genellikle programlamada yaygın olarak kullanılır ve yararlıdır.


Çok Boyutlu Diziler

Bir boyutun ötesindeki uzayları da kapsayan çok boyutlu diziler sayesinde daha kompleks verileri işlemek mümkündür. Çok boyutlu diziler, iki ya da daha fazla boyutlu dizilerdir. MATLAB gibi bazı dillerin temel veri yapısı olarak bilinen çok boyutlu dizi, C++ da STL ile birlikte kullanılabilir.

Çok boyutlu diziler, tek boyutlu dizilere benzer şekilde tanımlanan elemanlardan oluşur. Farkı ise çok boyutlu dizilerin internet üzerindeki örümcek ağlarına benzeyen düzenlemesinde yatar. Örneğin, iki boyutlu bir dizi bir tablo gibi görünebilir, elemanların sütun ve satırlarında bulunduğu bir yapıdadır.

Çok boyutlu dizilerin avantajlarından biri, düzenlemesi nedeniyle verilerin işlenmesinin kolaylaşmasıdır. Özellikle görüntü işleme ve ses işleme gibi çeşitli uygulamalarda en az iki boyutu olan dizilere ihtiyaç duyulur. Ayrıca, çok boyutlu dizilerle daha fazla veri depolama kapasitesine ulaşılabilir ve bu verileri işlemek daha hızlıdır.

Çok boyutlu dizilerin bir türü jagged dizilerdir. Bu tür dizilerde her satırın farklı sütun sayısı vardır. İki boyutlu dizilere benzer şekilde, jagged diziler birden fazla boyutlu da olabilir ve verilerin saklanması için farklı bir yapı kullanılır. İki boyutlu dizilerde ise tüm satırların aynı sütun sayısı vardır. Matrisler olarak da adlandırılan iki boyutlu diziler, temelde verileri matris şeklinde işlemek için kullanılır.

C++ ile çok boyutlu dizilerin kullanımı, istenilen boyutta ve tipte anında bir dizi oluşturulmasına olanak tanır. Özellikle yüksek boyutlu dizilerde el ile for döngüleri kullanılması yerine STL ile hazır kütüphanelerden faydalanarak, kodun daha okunaklı ve kolay anlaşılır olmasını sağlar.


Jagged Diziler

Jagged diziler, farklı uzunlukta alt dizilere sahip olan bir dizi türüdür. Bir jagged dizisi içindeki her alt dizi, farklı uzunlukta olabilir ve ayrı hafızada depolanabilir. Bu, bir jagged dizisinin boyutlarının dinamik olarak değişebileceği anlamına gelir.

Jagged diziler, özellikle 2D veya 3D modeller gibi yapısal verileri yönetmek için kullanışlıdır. Her bir satırın farklı sütun sayısına sahip olabileceği matrislerle karşılaştırıldığında, jagged dizilerin boyutları daha dinamiktir ve depolama alanının daha etkili kullanımına izin verir.

Bir jagged dizisi oluşturmak için, bir dizi koleksiyonu oluşturup her bir öğesine ayrı bir dizi atamanız gerekmektedir. Örneğin, bir üniversite öğrenci kayıt sistemi oluşturmak için, her bir bölümün öğrencilerini ayrı bir dizi altında saklayabilirsiniz. Bu sayede, her bölümün farklı sayıda öğrencisi olsa bile, hafızada gereksiz yer kaplamadan öğrenci listesi saklanabilir.

Aşağıda jagged dizisi örneği için bir kod bloğu verilmiştir:

int[][] jaggedArray = new int[3][]; jaggedArray[0] = new int[] { 1, 2 };jaggedArray[1] = new int[] { 3, 4, 5, 6 };jaggedArray[2] = new int[] { 7, 8, 9 };

Yukarıdaki kod, bir jagged dizi içinde üç ayrı dizi öğesi oluşturur. İlk dizi 2 eleman içerirken, ikinci dizi 4 eleman ve son dizi 3 eleman içermektedir.

Jagged diziler, özellikle bellek verimliliği gerektiren uygulamalar için idealdir. Ancak, düzensiz yapısı nedeniyle diğer veri yapılarına göre daha zor anlaşılabilir ve kullanımı biraz daha zor olabilir.

Bu nedenle, jagged diziler ihtiyacınız olduğunda kullanabileceğiniz kullanışlı bir seçenektir.


İki Boyutlu Diziler

İki boyutlu diziler, veri saklama ve işleme için kullanılan çok yönlü bir yapıdır. Bu diziler, satır ve sütun şeklinde birden fazla boyuttan oluşur. Örneğin, bir matris, bir iki boyutlu dizi olarak tanımlanabilir.

İki boyutlu diziler, genellikle matrisler, tablolar ve grafikler gibi verileri temsil etmek için kullanılan bir yapıdır. Bu diziler, verilerin konumlarına göre erişilebilir ve işlenebilir. İki boyutlu diziler, simetrik ya da düzensiz olabilir ve her bir öğe, iki boyutlu koordinat sistemine atıfta bulunacak şekilde erişilebilir.

İki boyutlu dizilerin kullanım alanları oldukça geniştir. Örneğin, matematiksel hesaplamalar, öğrenci notları, satış rakamları, envanter verileri, müşteri bilgileri, üretim verileri, vb. için kullanılabilir. Ayrıca, grafikler ve çizelgeler gibi görsel verileri depolamak için de kullanılırlar.

İki boyutlu diziler temel olarak iki türe ayrılabilir: simetrik ve düzensiz. Simetrik iki boyutlu diziler, her satır ve sütunun eşit boyutta olduğu bir yapıya sahiptir. Düzensiz iki boyutlu diziler ise bu yapıya sahip değildir ve satır ve sütun boyutları farklı olabilir.

İki boyutlu diziler, veri depolamanın yanı sıra veri manipülasyonu için de kullanılır. Bu veri yapıları, programlamanın yönetimini kolaylaştırır ve verilerin düzenlenmesine olanak tanır. Örneğin, bir iki boyutlu dizi kullanarak matematiksel hesaplamalar yapmak, karmaşık işlemleri kolaylaştırabilir ve verilerin takibini daha etkili hale getirebilir.

İki boyutlu diziler ayrıca, verilerin düzenlenmesi ve işlemesi için bazı kullanışlı işlevler ile birlikte kullanılabilir. Örneğin, bir iki boyutlu dizi üzerinde boyutunu değiştirme, elemanları döndürme, sıralama vb. işlemler yapmak için kullanışlı işlevler mevcuttur.


Sıralı Veri Yapıları

Sıralı veri yapıları, verilerin belirli bir sırayla depolandığı ve erişilebildiği veri yapılarıdır. Bu yapılar arasında bağlı listeler, yığınlar ve kuyruklar bulunur.

Bağlı listeler, birbirine bağlı düğümlerin oluşturduğu bir veri yapısıdır. Her düğüm, bir veri ve bir sonraki düğümün adresini içerir. Bu yapı, verilerin belirli bir sırayla depolanmasını sağlar ve ekleme/silme işlemleri için oldukça kullanışlıdır. Tektipi ve çift yünlü olmak üzere farklı tipleri vardır.

Bağlı Liste Türü Kullanım Alanı
Tektipi Çok sayıda veri depolama, ağaç ve grafları uygulamalarda kullanma
Çift Yönlü Görsel arayüzlü uygulamalarda kullanma, veri depolama, veri erişimi

Yığınlar ve kuyruklar ise elemanların belirli bir sırayla depolandığı ama verilere rasgele erişilebildiği veri yapılarıdır. Yığınlar son giren elemanın ilk çıkacağı (LIFO), kuyruklar ise ilk giren elemanın ilk çıkacağı (FIFO) şekilde çalışır.

  • Yığınların kullanım örnekleri:
  • - Geri al/Yenile işlevlerinde kullanım
  • - Fonksiyon çağrıları
  • - Hata işleme mekanizmalarında kullanım
  • Kuyrukların kullanım örnekleri:
  • - Dosya aktarımları
  • - İşlemciler arasındaki iletişim
  • - Yazıcı sıralaması

Sıralı veri yapıları, programlama dillerinde oldukça yaygın olarak kullanılır ve STL'de de yer almaktadır. Bu yapıların avantajları, verilere erişim hızını arttırması ve belirli işlemleri kolaylaştırmasıdır.


Bağlı Listeler

Bağlı listeler, veri yapıları içerisinde en sık kullanılan yapılardan biridir. Bu yapıların en büyük avantajı, herhangi bir boyuta sahip olabilmesidir. Bu sayede, listede herhangi bir elemanı en başta, ortada veya en sondaki konumundan hızlı bir şekilde silebilir veya ekleyebilirsiniz.

Bağlı listelerin iki farklı türü bulunmaktadır: çift yönlü ve tek yönlü bağlı listeler. Tek yönlü bağlı listeler, elemanların sadece bir önceki veya bir sonraki elemana bağlanabileceği bir yapıdır. Çift yönlü bağlı listeler ise, daha esnek bir yapıya sahiptir ve elemanlar hem bir önceki hem de bir sonraki elemana bağlanabilir. Bu sayede, çift yönlü bağlı listelerde elemanlar daha hızlı aranabilir ve buna bağlı olarak daha hızlı silinebilir ve eklenebilir.

Bağlı listelerin kullanım alanları oldukça geniştir. Özellikle, oyun programlama, grafik isleme ve arama algoritmalarında sıklıkla kullanılır. Bağlı listelerin kullanımını gerektiren örnek bir senaryo ise, kullanicinin girdiği sayıları sıralama işlemidir. Sıralanması gereken sayılar bağlı listeye eklenebilir ve daha sonra listenin yapısı kullanılarak sayılar sıralanabilir.


Yığınlar ve Kuyruklar

Yığınlar ve kuyruklar, sıralı veri yapıları olarak bilinirler. Bu veri yapıları, özellikle sıraya göre depolanması ve erişilmesi gereken veriler için kullanılırlar. Yığınlara ve kuyruklara eklenen her yeni veri öğesi, sonraki veri öğelerinin önceliğini değiştirir ve belirli bir sıraya sokar. İkisi arasındaki en büyük fark, yığınların son giren ilk çıkar (LIFO) prensibine göre çalışırken, kuyrukların ise ilk giren ilk çıkar (FIFO) prensibine göre çalışmasıdır.

Yığınlar, birçok alanda kullanılan önemli bir veri yapısıdır. Örneğin, belirli bir işlemi gerçekleştiren bir program sırasında, programlama dilleri yığınları bellek üzerinden yönetir. Yığınlar ayrıca, öncelik sırasına göre işlem yapılması gereken durumlarda veya hafıza paylaşımı yaparken kullanılır.

Kuyruklar, genellikle veri girişinin bir yönde olduğu ve çıkışın diğer yönde olduğu durumlarda kullanılır. Örneğin, bir mağazada sıraya girilmesi gereken durumlarda, bir kuyruk oluşturulabilir. Bir kuyruk ayrıca, ilk gelen ilk hizmet ver (FIFO) prensibinin kullanıldığı bir çevrimiçi oyunda da kullanılabilir. Önceliği yüksek olan kullanıcılar öncelikli olarak kuyruğa alınır.

Yığınlar Kuyruklar
Son giren ilk çıkar prensibi (LIFO) İlk giren ilk çıkar prensibi (FIFO)
Eklenen her veri öğesi önceliği değiştirir Eklenen her veri öğesi sıranın sonuna eklenir
Bellek yönetimi için kullanılır Sıraya göre veri tutmak için kullanılır

Yukarıdaki tabloya bakıldığında, yığın ve kuyrukların pek çok benzer özelliği olduğu görülebilir. Ancak yığınlar son giren ilk çıkar (LIFO) prensibiyle çalışırken, kuyruklar ilk giren ilk çıkar (FIFO) prensibiyle çalışır. Yığınlar genellikle bellek yönetimi için kullanılırken, kuyruklar sıraya göre veri tutmak için kullanılır.


Asıl Avantajları

STL, birçok avantaj sunarak veri yapılarını kullanmayı kolaylaştırır.

  • Veri Yapılarına Hazır Erişim: STL, kullanıcılara hazır veri yapıları sunarak, bu veri yapılarına hızlı ve kolay bir şekilde erişmelerini sağlar. Bu şekilde hem zaman kazanılır, hem de veri yapılarının çeşitli işlevlerini daha kolay bir şekilde gerçekleştirirler.
  • Diğer Veri Yapılarının İyileştirilmesi: STL, diğer veri yapılarını da kullanır ve bu veri yapılarının sınırlarını geliştirerek daha verimli hale getirir. Örneğin, STL'nin yazdığı kodlarda veri yapılarından daha fazla yararlanıldığı için, birçok programda daha hızlı bir şekilde çalışırlar.
  • Büyük Yazılım Projelerinde Kullanım Kolaylığı: STL, büyük yazılım projelerinde kullanım kolaylığı sağlar. Bu projelerde, birçok farklı veri yapısı kullanılır ve bunların her biri farklı işlevleri gerçekleştirir. STL, bu veri yapıları arasında geçiş yapmayı ve birbirleriyle uyumlu bir şekilde çalışmalarını kolaylaştırır.
  • İleri Düzey Veri Yapıları: STL, ileri düzey veri yapıları oluşturmanızı da sağlar. Bu veri yapıları, normal veri yapılarından daha fazla işlevsellik sağlar ve birçok programda kullanılır.

Her ne kadar STL'nin kullanımı, başlangıçta karmaşık gibi görünse de, sağladığı avantajlar nedeniyle onu kullanmak, kod yazmanın daha kolay ve verimli olduğunu gösterir. Özellikle büyük yazılım projeleri için, STL'nin veri yapılarını kullanmak, zaman ve enerji tasarrufu sağlayarak, daha verimli ve kolay bir şekilde kod yazmanızı sağlayacaktır.


Kod Örnekleri

Veri yapıları ve STL hakkında birçok şey öğrenirken, kod örnekleri bu konuları anlamaya yardımcı olabilir. Aşağıda, STL kullanarak basit veri yapıları oluşturmak için kod örnekleri verilmiştir.

  • Dizi kullanarak: Behzat Ç. Dizinin ilk sezonunda Kıvılcım ve Harun çerezleri nasıl kaydettiğini hatırlar mısınız? İşte o çerezler bir dizi içinde saklanıyordu. Aşağıdaki kod, sadece bir boyutlu dizilerin nasıl tanımlanacağını ve değiştirilebildiğini göstermektedir:
  • #include <iostream>
    using namespace std;
    int main() {
        int my_array[5] = { 1, 5, 3, 7, 13 };
        cout << "Second element: " << my_array[1] << endl;
        my_array[3] = 42;
        cout << "Fourth element: " << my_array[3] << endl;
        return 0;
    }
  • Listeler kullanarak: Liste, sıralı bir yapıda depolama sağlar. Aşağıdaki kod, STL listesi kullanarak elemanların eklenip silinebileceğini ve listelerin nasıl oluşturulacağını göstermektedir:
  • #include <iostream>
    #include <list>
    using namespace std;
    int main() {
        list<int> my_list;
        for(int i=0; i<5; i++)
            my_list.push_back(i*5);
        my_list.pop_front();
        return 0;
    }