C++ Örnekle Dizilerin Dinamik Tahsisi

Dinamik Dizi Nedir?

Dinamik bir dizi normal bir diziye oldukça benzer, ancak boyutu programın çalışma zamanı sırasında değiştirilebilir. DynamArray öğeleri bitişik bir bellek bloğunu kaplar.

Bir dizi oluşturulduktan sonra boyutu değiştirilemez. Ancak dinamik dizi farklıdır. Dinamik bir dizi, doldurulduktan sonra bile boyutunu genişletebilir.

Bir dizinin oluşturulması sırasında önceden belirlenmiş miktarda bellek tahsis edilir. İhtiyaç olduğunda bellek boyutunu belirli bir faktör kadar arttırdığı için dinamik dizide durum böyle değildir.

Dinamik Dizilerin performansını etkileyen faktörler

Dizinin başlangıç ​​boyutu ve büyüme faktörü performansını belirler. Aşağıdaki noktalara dikkat edin:

  1. Bir dizinin boyutu küçükse ve büyüme faktörü küçükse, belleği daha sık yeniden tahsis etmeye devam edecektir. Bu dizinin performansını düşürecektir.
  2. Bir dizinin boyutu büyükse ve büyüme faktörü büyükse, büyük miktarda kullanılmayan bellek olacaktır. Bu nedenle yeniden boyutlandırma işlemleri daha uzun sürebilir. Bu dizinin performansını düşürecektir.

Yeni Anahtar Kelime

In C++, new anahtar sözcüğünü kullanarak dinamik bir dizi oluşturabiliriz. Tahsis edilecek öğe sayısı bir çift köşeli parantez içinde belirtilir. Tür adı bundan önce gelmelidir. İstenen öğe sayısı tahsis edilecektir.

Sözdizimi

Yeni anahtar sözcüğü aşağıdaki sözdizimini alır:

pointer_variable = new data_type;

pointer_variable, değişkenin adıdır. işaretçi değişkeni.

data_type geçerli bir değer olmalıdır C++ veri türü

Anahtar kelime daha sonra ilk öğeye bir işaretçi döndürür. Dinamik diziyi oluşturduktan sonra delete anahtar sözcüğünü kullanarak silebiliriz.

Örnek 1:

#include<iostream>
using namespace std;
int main() {
	int x, n;
	cout << "Enter the number of items:" << "\n";
	cin >>n;
	int *arr = new int[n];
	cout << "Enter " << n << " items" << endl;
	for (x = 0; x < n; x++) {
		cin >> arr[x];
	}
	cout << "You entered: ";
	for (x = 0; x < n; x++) {
		cout << arr[x] << " ";
	}
	return 0;
}

Çıktı:

Yeni Anahtar Kelime

İşte kodun ekran görüntüsü:

Yeni Anahtar Kelime

Kod Açıklaması:

  1. Kullanmak için iostream başlık dosyasını programımıza ekleyin. fonksiyonlar.
  2. Sınıflarını çağırmadan kullanabilmek için programımıza std ad alanını ekleyin.
  3. main() fonksiyonunu çağırın. Program mantığı fonksiyonun gövdesine eklenmelidir.
  4. İki tam sayı değişkeni x ve n'yi bildirin.
  5. Kullanıcının n değişkeninin değerini girmesini isteyen bir metni konsola yazdırın.
  6. Kullanıcı girişini klavyeden okuyun ve bunu n değişkenine atayın.
  7. Toplam n tamsayıyı tutacak bir dizi bildirin ve onu *arr işaretçi değişkenine atayın.
  8. Kullanıcının n sayıda öğe girmesini isteyen bir mesaj yazdırın.
  9. Kullanıcı tarafından girilen öğeler üzerinde yineleme yapacak bir döngü değişkeni x oluşturmak için for döngüsünü kullanın.
  10. Kullanıcı tarafından girilen elemanları okuyun ve bunları arr dizisine kaydedin.
  11. Vücudun sonu döngü için.
  12. Konsola bir miktar metin yazdırın.
  13. Dizinin öğeleri üzerinde yineleme yapmak üzere bir x döngü değişkeni oluşturmak için for döngüsünü kullanın.
  14. Konsolda arr isimli dizide yer alan değerleri yazdırın.
  15. For döngüsünün gövdesinin sonu.
  16. Program başarılı bir şekilde tamamlandıktan sonra değeri döndürmelidir.
  17. Main() işlevinin gövdesinin sonu.

NOT: Yukarıdaki örnekte, kullanıcının çalışma süresi boyunca dizi için herhangi bir boyut belirtmesine izin verilmektedir. Bu, dizinin boyutunun çalışma zamanı sırasında belirlendiği anlamına gelir.

Dinamik olarak ayrılmış dizileri başlatma

Dinamik bir diziyi 0'a başlatmak kolaydır.

Sözdizimi:

int *array{ new int[length]{} };

Yukarıdaki sözdiziminde uzunluk, diziye eklenecek öğe sayısını belirtir. Diziyi 0 olarak başlatmamız gerektiğinden bu boş bırakılmalıdır.

Başlatıcı listesini kullanarak dinamik bir diziyi başlatabiliriz. Bunu gösteren bir örnek oluşturalım.

Örnek 2:

#include <iostream>
using namespace std;

int main(void) {

	int x; 

	int *array{ new int[5]{ 10, 7, 15, 3, 11 } };

	cout << "Array elements: " << endl;

	for (x = 0; x < 5; x++) {

		cout << array[x] << endl;
	}

	return 0;
}

Çıktı:

Dinamik olarak ayrılmış dizileri başlatma

İşte kodun ekran görüntüsü:

Dinamik olarak ayrılmış dizileri başlatma

Kod Açıklaması:

  1. İşlevlerini kullanmak için iostream başlık dosyasını programımıza ekleyin.
  2. Sınıflarını çağırmadan kullanmak için programımıza std ad alanını ekleyin.
  3. main() fonksiyonunu çağırın. Program mantığı fonksiyonun gövdesine eklenmelidir.
  4. X adında bir tamsayı değişkeni bildirin.
  5. Bir başlatıcı listesi kullanarak dizi adlı dinamik bir dizi bildirin. Dizi 5 tamsayı elemanı tutacak. Dizi uzunluğu ile başlatıcı listesi arasında “=” operatörünü kullanmadığımızı unutmayın.
  6. Konsola bir miktar metin yazdırın. Sonu bir C++ bitiş çizgisi anlamına gelen anahtar kelime. İmleci bir sonraki cümleye taşır.
  7. Dizi öğeleri üzerinde yineleme yapmak için for döngüsü kullanın.
  8. Dizi adlı dizinin içeriğini konsolda yazdırın.
  9. For döngüsünün gövdesinin sonu.
  10. Program başarılı bir şekilde tamamlandıktan sonra değeri döndürmelidir.
  11. Main() işlevinin gövdesinin sonu.

Dizileri Yeniden Boyutlandırma

Dinamik dizinin uzunluğu tahsis süresi boyunca ayarlanır.

Bununla birlikte, C++ tahsis edildikten sonra bir diziyi yeniden boyutlandırmaya yönelik yerleşik bir mekanizmaya sahip değildir.

Ancak dinamik olarak yeni bir dizi tahsis ederek, öğelerin üzerine kopyalayıp eski diziyi silerek bu zorluğun üstesinden gelebilirsiniz.

Not: Bu tekniğin hatalara açık olduğunu unutmayın, bu nedenle bundan kaçınmaya çalışın.

Dizileri Dinamik Olarak Silme

Dinamik bir dizi, amacına ulaşıldığında bilgisayar belleğinden silinmelidir. Silme ifadesi bunu başarmanıza yardımcı olabilir. Serbest bırakılan bellek alanı daha sonra başka bir veri kümesini tutmak için kullanılabilir. Ancak dinamik diziyi bilgisayar belleğinden silmeseniz bile program sonlandırıldığında otomatik olarak silinecektir.

Not:

Dinamik bir diziyi bilgisayar belleğinden silmek için silmek yerine silme[] kullanmalısınız. [] CPU'ya bir değişken yerine birden fazla değişkeni silme talimatını verir. Dinamik bir diziyle uğraşırken delete[] yerine delete kullanılması sorunlara neden olabilir. Bu tür sorunlara örnek olarak bellek sızıntıları, veri bozulması, çökmeler vb. verilebilir.

Örnek 3:

#include<iostream>
using namespace std;
int main() {
	int x, n;
	cout << "How many numbers will you type?" << "\n";
	cin >>n;
	int *arr = new int[n];
	cout << "Enter " << n << " numbers" << endl;
	for (x = 0; x < n; x++) {
		cin >> arr[x];
	}
	cout << "You typed: ";
	for (x = 0; x < n; x++) {
		cout << arr[x] << " ";
	}
	cout << endl;
	delete [] arr;
	return 0;
}

Çıktı:

Dizileri Dinamik Olarak Silme

İşte kodun ekran görüntüsü:

Dizileri Dinamik Olarak Silme

Kod Açıklaması:

  1. Fonksiyonlarını kullanabilmek için iostream başlık dosyasını programımıza ekleyiniz.
  2. Sınıflarını çağırmadan kullanabilmek için programımıza std ad alanını ekleyin.
  3. main() fonksiyonunu çağırın. Program mantığı fonksiyonun gövdesine eklenmelidir.
  4. Tamsayı veri tipinin iki değişkenini x ve n bildirin.
  5. Konsola bir miktar metin yazdırın. Metin kullanıcıdan girecekleri sayı sayısını belirtmesini isteyecektir.
  6. Kullanıcı girişini klavyeden okuyun. Giriş değeri n değişkenine atanacaktır.
  7. Bir işaretçi değişkeni *arr bildirin. arr dizisi toplam n tamsayıyı depolamak için bir miktar bellek ayıracaktır.
  8. Konsolda kullanıcıdan n sayı girmesini isteyen bir mesaj yazdırın.
  9. Kullanıcı tarafından girilen sayıları yinelemek için bir for döngüsü ve x döngü değişkeni oluşturun.
  10. Kullanıcı tarafından girilen sayıları okuyun ve bunları arr dizisine kaydedin.
  11. For döngüsünün gövdesinin sonu.
  12. Konsola bir miktar metin yazdırın.
  13. arr dizisinin içeriği üzerinde yineleme yapmak için for döngüsünü ve x döngü değişkenini kullanın.
  14. Arr dizisinin değerlerini konsolda yazdırın.
  15. For döngüsünün gövdesinin sonu.
  16. Konsola boş bir satır yazdırın.
  17. Arr dizisinin belleğini boşaltın.
  18. Program başarıyla tamamlandığında değeri döndürecektir.
  19. Main() işlevinin gövdesinin sonu.

ÖZET

  • Normal dizilerin sabit bir boyutu vardır. Bildirildikten sonra boyutlarını değiştiremezsiniz.
  • Bu tür dizilerde bellek boyutu derleme süresi sırasında belirlenir.
  • Dinamik diziler farklıdır. Çalışma süresi boyunca boyutları değiştirilebilir.
  • Dinamik dizilerde boyut, çalışma zamanı sırasında belirlenir.
  • Dinamik diziler C++ new anahtar sözcüğü kullanılarak bildirilir.
  • Dinamik dizide saklanacak öğe sayısını belirtmek için köşeli parantez kullanırız.
  • Diziyle işimiz bittiğinde silme operatörünü kullanarak belleği boşaltabiliriz.
  • Tüm dizi öğelerinin belleğini boşaltmak için silme operatörünü [] ile kullanın.
  • [] içermeyen bir silme işlemi yalnızca tek bir öğenin belleğini serbest bırakır.
  • Yeniden boyutlandırmak için yerleşik bir mekanizma yok C++ diziler.
  • Bir diziyi liste başlatıcı kullanarak başlatmak için “=” operatörünü kullanmayız.

Devamını Oku readmore