آنچه میخوانید ویراست جدید نوشتهای است که اولین بار با عنوان «آرایه پویای دو بعدی در ++C»
مرداد ماه ۱۳۸۵
از طریق وبگاه برنامهنویسی و طراحی الگوریتم (عنوان و طرح پیشین وبگاه الگوریتمستان)
منتشر شده بود.
آرایههای دو بعدی کاربردهای بسیاری از جمله جداول و ماتریسها دارند. اهمیت تعریف آرایههای پویای دو بعدی کمتر از آرایههای یک بعدی نیست. آرایههای پویای دو بعدی یک ویژگی جالب در مقایسه با آرایهی ایستا دارند. شما با تعریف پویای آرایههای دو بعدی میتوانید جداول غیرمستطیلی تشکیل دهید. در واقع وقتی آرایههای دو بعدی را به صورت پویا ایجاد میکنید، این اختیار را دارید که تعداد ستونهای هر ردیف را متفاوت انتخاب کنید.
به قطعه کد زیر توجه کنید:
1 | int **table;
|
2 | cin >> n;
|
3 | table = new int*[n];
|
4 | int i, j;
|
5 | for (i = 1 ; i <= n ; i++){
|
6 | table[i - 1] = new int[i];
|
7 | for (j = 1 ; j <= i ; j++)
|
8 | table[i - 1][j - 1] = i * j;
|
9 | }
|
10 | .
|
11 | .
|
12 | .
|
13 | for (i = 0 ; i < n ; i ++)
|
14 | delete[] table[i];
|
15 | delete[] table;
|
16 | |
این کد عدد n را از کاربر گرفته و نیمهی پایینی جدول ضرب n در n را در یک آرایهی پویا ذخیره میکند. جدول ضرب اعداد متقارن است و نیازی به ذحیره کردن اعداد همهی خانههای جدول نیست. در نتیجه با آرایهی پویای دو بعدی حافظهی مصرفی تقریبا نصف میشود.
متغیر table که به صورت table** تعریف شده است، یک اشارهگر به اشارهگر است. کامپایلر وقتی با دستور
مواجه میشود، یک آرایهی پویای یک بعدی به طول n از اشارهگرهای صحیح ایجاد میکند. پس عناصر
| table[0], table[1], ..., table[n - 1] |
هر کدام یک اشارهگر از نوع صحیح هستند. حال با دستور
| table[i - 1] = new int[i] |
برای هر اشارهگر یک آرایهی پویای یک بعدی منسوب میکنیم.
مثلا به ازای n = 3 عناصر table به صورت زیر هستند:
1 | table[0][0]
|
2 | table[1][0], table[1][1]
|
3 | table[2][0], table[2][1], table[2][2] |
با استفاده از چنین ساختاری به سادگی میتوانید ماتریسها و سایر دادهها با فرم چدول دو بعدی را پیادهسازی کنید. بزرگترین مزیت این حالت به حالت آرایهی استاتیک استفادهی صحیح از حافظه در دسترس است.