C++'ta Diziler ve İterator Kullanımı

C++'ta Diziler ve İterator Kullanımı

C++'ta diziler ve iteratorlar önemli bir yere sahiptir Diziler, birden fazla veriyi depolamak için kullanılır ve programlama dili içinde oldukça sık kullanılır Sabit boyutlu ve değişken boyutlu diziler kullanılabilir Diziler, verileri depolayarak programları daha verimli hale getirir Dizi elemanlarına erişmek için for döngüsü, while ve do-while döngüleri kullanılır Yukarıdaki kod örnekleri dizilerin nasıl kullanılabileceğini göstermektedir Iteratorlar ise, belirli bir veri türünü işlemek için kullanılan özel bir dizi yapısıdır Detaylı bilgi için okumaya devam edin

C++'ta Diziler ve İterator Kullanımı

C++'ta programlama yaparken diziler ve iteratorlar oldukça önemli bir yer tutar. Bu yüzden bu konuda bilgi sahibi olmak, programlama sürecini daha verimli ve kolay hale getirebilir. Diziler, birden fazla veriyi depolamak için kullanılır ve programlama dilinde oldukça sık kullanılır. İteratorlar ise, belirli bir veri türünü işlemek için kullanılan özel bir dizi yapısıdır. İlerleyen süreçte, bu konuların detaylarına daha ayrıntılı bir şekilde bakılacaktır.


Dizilerin Tanımı

C++ programlama dili, dizileri tanımlamak için bir veri tipi sağlar. Diziler, aynı türdeki verilerin bir arada tutulduğu bir veri koleksiyonudur. Örneğin, 100 tane integer sayı içeren bir dizi, bir integer tipindeki bellek bloğunda 100 elemandan oluşan bir koleksiyondur.

Diziler, programcıların aynı türdeki verileri işlemesine olanak tanır ve verilerin ait oldukları indekslerle erişilmesini sağlar. Bir dizi, birden fazla değişkenin ayrı ayrı tanımlanması yerine tek bir ad altında gruplandırılması ile de kodu daha düzenli hale getirir. Diziler, sabit boyutlu ve değişken boyutlu olarak tanımlanabilir.

Sabit boyutlu diziler, önceden belirtilen bir boyutta olsa da veri elemanları dinamik olarak atanabilirken, değişken boyutlu diziler, çalışma zamanında tanımlanıp hafıza içinde büyütülebilir. Diziler, C++'ta bazı özelliklerle birlikte gelir ve farklı şekillerde tanımlanabilir. Bu nedenle, programcıların dizilerin yapısı ve kullanımı hakkında ayrıntılı bilgi sahibi olmaları çok önemlidir.


Dizilerin Kullanımı

Diziler, birden fazla veri elemanını depolamak için kullanılan bir yapıdır. Dizilerin kullanımı, programlama dillerinde sıklıkla karşılaşılan bir konudur. Dizilerin farklı kullanım örnekleriyle ilgili örnekler aşağıda verilmiştir.

Kullanım Örneği Kod Parçası
Bir dizinin elemanlarını sıralama
        int arr[] = {5, 3, 1, 4, 2};        int n = sizeof(arr)/sizeof(arr[0]);        sort(arr, arr+n);      
Bir dizinin elemanlarını tersten yazdırma
        int arr[] = {5, 3, 1, 4, 2};        int n = sizeof(arr)/sizeof(arr[0]);        for(int i=n-1; i>=0; i--)          cout << arr[i] << " ";      
Bir diziye eleman ekleme
        int arr[5] = {5, 3, 1, 4, 2};        int n = 5;        arr[n] = 6;        n++;      

Diziler ayrıca, verileri depolayarak programları daha verimli hale getirir. Dizilerin kullanımı, özellikle veri analizi gibi işlemlerde de çeşitli yararlar sağlar.


Dizi Elemanlarına Erişim

C++ dili ile yazdığımız programlarda, diziler en sık kullanılan veri yapılarından biridir. Dizilerin en temel amacı, birden fazla veriyi tek bir değişkende saklamaktır. Bir diziyi tanımlarken, ismini ve boyutunu belirtmemiz gerekir. Dizi elemanlarına erişmek için ise, elemanın indis numarasını kullanırız.

Dizideki elemanlara erişmek için, for, while veya do-while gibi döngüler kullanabiliriz. Bu döngülerle, dizinin elemanlarına tek tek erişebiliriz. Ayrıca, dizi elemanlarına pointer kullanarak da erişebiliriz. Bu yöntemde, bir pointer kullanarak dizinin elemanlarının adreslerini tutar ve bu adresleri kullanarak elemanlara erişiriz.

Döngü Yöntemi Pointer Yöntemi
  • for (int i = 0; i < boyut; i++)
  • {
  •     cout << dizi[i] << endl;
  • }
  • for (int *ptr = dizi; ptr < dizi + boyut; ptr++)
  • {
  •     cout << *ptr << endl;
  • }

Dizi elemanlarına erişmek için kullanabileceğimiz bir diğer yöntem ise, [] operatörünü kullanmaktır. Bu yöntemde, elemanların indis numaralarını [] içinde belirterek erişebiliriz.

int dizi[5] = {1, 2, 3, 4, 5};cout << dizi[0] << endl; // çıktı: 1

Dizi elemanlarına erişmek kadar önemli bir diğer konu ise, dizinin boyutunu belirlemektir. Bir dizinin boyutunu değiştirmek için, önce yeni boyutta bir dizi oluşturup, daha sonra eski dizinin elemanlarını bu yeni diziye kopyalamak gerekir.

int eskiDizi[5] = {1, 2, 3, 4, 5};int yeniBoyut = 10;int *yeniDizi = new int[yeniBoyut];for (int i = 0; i < 5; i++){    yeniDizi[i] = eskiDizi[i];}delete[] eskiDizi;

Bu şekilde, yeni boyutta bir dizi oluşturarak, daha büyük veya daha küçük bir boyuta sahip bir diziyi yeniden boyutlandırabiliriz.


Döngülerle Elemanlara Erişim

Dizilerin elemanlarına erişmek için kullanılabilecek yöntemlerden biri ise döngülerdir. Bu döngüler, elemanlara sırayla erişerek işlem yapmayı sağlar.

For döngüsü, dizinin elemanlarına erişmek için en yaygın kullanılan döngü türüdür. For döngüsü içerisinde bulunan değişkenler, dizinin elemanlarına erişmek için kullanılır. Örneğin, aşağıdaki kod bloğu, bir diziyi for döngüsü ile dolaşarak elemanlarını ekrana yazdırmaktadır:

for(int i=0; i

While ve do-while döngüleri de dizinin elemanlarına erişmek için kullanılabilir. Bu döngülerde i değerini arttırmak yerine, i değeri bu defa döngü içerisinde kendisi artar. Örnek olarak, while döngüsü kullanarak bir dizideki sayıların toplamını hesaplayabilirsiniz:

int i = 0;int toplam = 0;while(i

Do-while döngüsü ise en az bir kez çalışır ve döngü koşuluna bağlı olarak tekrar edebilir. Döngü içerisindeki elemanlara erişmek için de yine dizinin indis numaraları kullanılır. Örnek olarak, aşağıdaki do-while döngüsü ile bir dizideki elemanları ekrana yazdırabilirsiniz:

int i = 0;do {    cout<

Bu şekilde döngüler kullanarak dizinin elemanlarına erişebilir ve istediğiniz işlemleri yapabilirsiniz.


Pointer Kullanarak Elemanlara Erişim

Dizinin elemanlarına erişmek için bir diğer yöntem de pointer kullanmaktır. Pointerlar, adresler üzerinden veriye erişebilen değişkenlerdir. Bir pointer tanımlayarak, o pointerın tuttuğu adres üzerinden dizi elemanına erişmek mümkündür.

Örneğin, aşağıdaki kod örneğinde integer türünde bir dizinin elemanlarına pointer kullanarak erişim gösterilmiştir:

int dizi[4] = {10, 20, 30, 40};int *p;p = dizi; // dizi pointerıcout << "Dizinin Ilk Elemani: " << *p << endl;p++;cout << "Dizinin Ikinci Elemani: " << *p << endl;

Burada, bir integer pointerı 'p' tanımlanmış ve 'p' değişkenine 'dizi' dizisinin ilk elemanının adresi atanmıştır (burada 'dizi' pointerı oluşturulmamıştır, ancak 'dizi' pointer olduğu anlaşılabilir). Daha sonra, 'p' pointerı bir artırılarak, 'dizi' dizisinin ikinci elemanına erişilmiştir.

Pointer kullanarak elemanlara erişim, döngülerle erişimden daha hızlıdır ve bazı durumlarda daha kolay okunabilir kodlar yazmaya yardımcı olabilir. Ancak, yanlış kullanıldığında bellek yönetimi sorunlarına neden olabilir. Dolayısıyla, pointer kullanarak erişim yaparken, bellek yönetimi kurallarına dikkat etmek önemlidir.


Dizi Boyutunun Değiştirilmesi

Diziler tanımlandıktan ve elemanları eklendikten sonra boyutu değiştirilebilir. Bu, bazen gereklidir çünkü program çalışırken dizinin boyutu artabilir veya azalabilir.

Dizinin boyutunu değiştirmek için, öncelikle yeni boyuta sahip başka bir dizi oluşturulur. Daha sonra, önceki dizideki elemanlar, yeni oluşturulan dizideki ilgili konumlara kopyalanır. Dizinin boyutunu değiştirmeden önce, mevcut dizinin elemanları kaybolmadan önce yeni bir dizi oluşturulmalıdır.

Örnek Kod: Açıklama:
int eski_dizi[] = { 1, 2, 3 };int yeni_boyut = 5;int* yeni_dizi = new int[yeni_boyut];for (int i = 0; i < 3; i++){    yeni_dizi[i] = eski_dizi[i];}
Bir dizi tanımlayın ve önceki boyutunu üç olarak ayarlayın. Sonra yeni bir boyut (beş) belirleyin. Yeni bir bellek bloğu ayrıldı ve eski elemanlar yeni bellek bloğuna kopyalandı.

Bunun gibi örnek kodlarda, eski dizinin elemanları yeni alana kopyalanır.

Dolayısıyla, dizinin boyutu gerektiği gibi değiştirilebilir ve dağıtım hafızası yönetimi yapılarak, programda performans ve bellek açısından avantaj sağlanabilir.


İteratorların Tanımı ve Kullanımı

C++ programlama dilinde, bir dizi üzerinde gezinme işlemlerini gerçekleştiren ve belirtilen koşullara uygun elemanlara erişim sağlayan İterator adı verilen bir yapı bulunmaktadır. İterator, belli bir aralıktaki elemanları tek tek gezmeye olanak sağlayan bir yapıdır. İteratorlar, bir dizi ya da vektör yapısının elemanlarına tek tek erişmek için kullanılır. İteratoru kullanarak, dizi üzerinde "döngü" yapmadan her elemana tek tek erişebiliriz. Bunun yanı sıra, İteratorlar pointerlar gibi davranırlar ve bellek adreslerini tutabilirler. İteratorlar genellikle bir dizi veya vektör nesnesinde kullanılan begin() ve end() fonksiyonları ile tanımlanırlar. begin() fonksiyonu, İteratorun ilk elemanını gösterirken, end() fonksiyonu son elemanın hemen sonrasındaki konuma işaret eder. Örneğin; vector sayilar; vector::iterator it; şeklinde bir tanımlama yapılırsa, it İterator yapısının tanımlandığı ve daha sonra sayilar vektöründe gezinmek için kullanılacağı anlaşılır. İterator yapısının en yaygın kullanımlarından biri, belirli bir işlem tarafından gerçekleştirilen for döngüsüdür. Bunun yanı sıra, while, do-while, switch-case gibi ötekiler yapılarda da İterator yapısından faydalanılabilir.


Başlangıç ve Bitiş İteratorleri

Iterator kullanımı sayesinde C++ programcıları, dizilerin elemanlarına erişebilir ve değiştirebilirler. Başlangıç ve bitiş iteratörleri, bir dizi içindeki öğeler için iterasyon yapmak için kullanılır. Genellikle, bir dizi adı, bir başlangıç noktası ve bir de bitiş noktası içerir.

Başlangıç ve bitiş iteratörleri, değer veya kategori açısından değişebilen çok çeşitli işlem yapıları ile kullanılabilir.

En sık kullanılan bitiş iteratörü, dizi dizin sınırıdır. Başlangıç değeri, dizinin ilk öğesini işaret ederken bitiş değeri dizinin son öğesinden bir sonraki yeri işaret eder. Birçok dizi örneği, işlemlere başlangıç ve bitiş iteratörleriyle başlamaktadır.

Başlangıç ve bitiş iteratörleri, öğelerin güncellenmesi için de kullanılabilir. Döngü içinde, iteratör, öğelerin güncellenmesi için kullanılabilir. Bu, kodlama sürecinde eşsiz bir esneklik sağlar ve programcıların dizileri yönetmelerine ve yeniden şekillendirmelerine izin verir.


Gerçek Dünya Uygulaması

Bir gerçek dünya uygulamasında, müşteri bilgilerini tutan bir veritabanı kullanıldığını varsayalım. Bu veritabanında, müşterilerin adı, adresi ve sipariş verdikleri ürünler yer almaktadır.

Müşteri bilgileri bir dizi halinde tutulabilir, ancak burada iterator kullanmak daha uygun bir seçenek olabilir. Çünkü iteratorlar, dizilerdeki elemanlara daha verimli bir şekilde erişim sağlarlar ve bellek yönetimini daha iyi kontrol ederler.

Iteratorlar, veritabanındaki müşteri bilgilerine erişimde kullanılabilirler. Örneğin, bir siparişin gönderim adresi değiştirilmek istendiğinde, ilgili müşterinin adresi iterator kullanılarak güncellenebilir. Ayrıca, belirli bir ürün için sipariş veren tüm müşterilerin listesi, iterator kullanılarak kolayca oluşturulabilir.

Müşteri Adı Adres Sipariş
Ahmet İstanbul Cep Telefonu
Canan Ankara Laptop
Bora İzmir Tablet

Yukarıdaki veritabanı örneğinde, tüm müşterilerin isimlerini ve siparişlerini listeleyen bir program yazalım. Bunun için bir for döngüsü kullanarak dizi elemanlarına erişmek yerine, bir iterator kullanabiliriz. Aşağıdaki örnek kod bu işlemi gerçekleştirir:

    vector<string> musteriler = {"Ahmet", "Canan", "Bora"};  vector<string> siparisler = {"Cep Telefonu", "Laptop", "Tablet"};  vector<string>::iterator it;  for (it = musteriler.begin(); it != musteriler.end(); it++) {      cout << *it << " - " << siparisler[it - musteriler.begin()] << endl;  }  
  • Öncelikle, müşteriler vector'ünde yer alan iterator'ün başlangıç ve bitiş konumları belirlendi. vector::begin() ve vector::end() işlevleri ile müşteriler için başlangıç ve bitiş konumları belirlendi.
  • Daha sonra, iterator turu ve ismi tanımlandı. Burada vector::iterator kullanıldı.
  • For döngüsü oluşturuldu ve her müşteri için birer satır olacak şekilde bir döngü yapıldı.
  • Döngüde, her müşterinin adı ve siparişi yazdırıldı. Burada iterator, müşteri adını tutarken, siparisler dizisine erişmek için indisleri kullanıldı.

Bu örnekte, iterator kullanarak veritabanındaki müşteri bilgilerine daha hızlı ve daha verimli bir şekilde erişim sağlandı. Ayrıca, bellek yönetimi de daha iyi kontrol edilerek programın daha düşük bellek kullanımıyla çalışması sağlandı.


Diziler ve İteratorlar Arasındaki Farklar

Diziler ve iteratorlar C++ programlama dilinde sıklıkla kullanılan öğelerdir. Ancak ikisi arasında belirgin farklılıklar da vardır. Diziler, sabit bir boyuta sahip veri yapılarıdır ve bellekte bir arka arkaya sıralanmış elemanların tutulması için kullanılırlar. Bu elemanlar arasında doğrudan erişim yapılabilir ve bellekte sürekli bir alan kaplarlar. Öte yandan, iteratorlar, bir dizide veya veri yapılarında öğeler arasında dolaşmak için kullanılır ve bellekte çok az yer kaplarlar.

Dizilerde elemanlara doğrudan erişim sağlanabilirken, iteratorlar bu elemanlara dolaylı yoldan erişim sağlarlar. Bunun nedeni, iteratorların bellekte tek bir noktayı göstermesidir ve bu nokta, dizi elemanlarının bellekteki yerlerini ifade etmek yerine, elemanların bellek adresleriyle işaret edilir. Ayrıca, bir dizi boyutu sabit olduğundan, boyut değiştirilemez, ancak iteratorlar sayesinde veri yapılarının boyutu değiştirilebilir.

Özellikle büyük veri yapılarında iteratorlar, nedeniyle bellek kullanımı açısından daha verimlidirler. Diziler sabit bir büyüklüğe sahip olduğu için, bellekteki alanı kullanım açısından en verimli şekilde kullanmayabilirler. Ancak iteratorlar, yalnızca veri yapısındaki elemanları işaret ederler ve böylece bellekte daha küçük bir alan kaplarlar.

İteratorlar ve diziler arasındaki bir diğer fark da bellek yönetimidir. Diziler bellekte sabit bir büyüklüğe sahiptir, dolayısıyla bellek erişimi yalnızca dizi elemanlarının sınırlarında gerçekleştirilir. Ancak iteratorlar, bellekte öğeler arasında hareket etmenin yanı sıra, bellek erişimi de sağlarlar. Bu, iteratorları daha esnek ve çok yönlü yapar.

Sonuç olarak, diziler ve iteratorlar C++ programlama dilinde sıklıkla kullanılan veri yapılarıdır. Dizilerin sabit boyutu ve elemanlarına doğrudan erişimi varken, iteratorlar esnek boyutları ve bellek kullanımı açısından daha verimli olmalarıyla öne çıkar. İteratorlar, veri yapısındaki elemanlara dolaylı erişim sağlar ve veri yapısının boyutunu değiştirmek için kullanılabilirler.


Erişim ve Bellek Yönetimi

Diziler ve iteratorlar C++ programlama dilinde oldukça önemli veri yapılarıdır. Diziler bellekte ardışık olarak tutulan elemanlardan oluşurken, iteratorlar ise dizi içerisinde ileri ve geri hareket edebilen nesnelerdir. Bu farklı yapıların erişim ve bellek yönetimi açısından bir takım farklılıkları vardır.

Dizilerin bellek yönetimi statiktir, yani dizinin boyutu oluşturulduktan sonra değiştirilemez ve bu boyutta bellekte sürekli olarak yer kaplarlar. Fakat iteratorlar dinamik bellek yönetimi kullanarak daha az bellek harcama avantajına sahiptirler. Iteratorlar istenildiği zaman bellekten alınabilir ve işlem bitince bellekteki alanın boşaltılabilir.

Dizi elemanlarına erişim, işlem türüne göre farklılık gösterir. For, while ve do-while döngüleri kullanılarak dizinin elemanlarına erişim sağlanabilirken, pointer kullanımıyla çok daha hızlı bir eleman erişimi sağlanabilir. Iteratorlar ise konumlarına göre elemanlara erişir ve bu konumları diziye ilişkili olmadan tutarlar.

İteratorların erişim ve bellek yönetimi, dizi elemanlarının erişiminden daha kullanışlıdır. Bellek yönetimi açısından iteratorlar daha esnek bir yapıya sahiptirler ve bellek kullanımının daha optimize şekilde yapılmasını sağlarlar. Erişim yöntemi olarak da iteratorlar dizinin boyutu değiştiği zaman da herhangi bir problem yaşatmazlar ve istenildiği zaman dizinin sonuna gitmek yerine direkt olarak istenilen elemana gitmek mümkündür.

Bellek yönetimi ve erişim açısından diziler ve iteratorlar arasında önemli farklar vardır. Dolayısıyla programlama dili içerisinde kullanılacak veri yapısına karar verirken bu farklılıklar göz önünde bulundurulmalıdır.