Динамічним називають такий масив, розмір якого можна змінювати під час виконання програми. Динамічні масиви надають змогу більш гнучко працювати з даними, оскільки дозволяють вводити довільний розмір. Для зміни розміру динамічного масиву мова програмування, що підтримує такі масиви, повинна надавати вбудовану функцію чи оператор. В порівняні зі статичним масивом, динамічний не має фіксованого розміру та може задаватись під час виконання програми. Замість використання змінної типу string можна використовувати масив змінних типу char
. У задачах пов'язаних з матрицями, матриці записують, як двовимірний масив. В старих комп'ютерах з малою кількістю оперативної пам'яті, а також при операціях з великою кількістю даних існує загроза повного засмічення пам'яті, тому в кінці програми прийнято видаляти масив.
Характеристика
- Розмірність — кількість індексів елемента (одновимірний, двовимірний, …, багатовимірний)
- Розмір — загальна кількість елементів у масиві.
- Логічний розмір — кількість елементів масиву, які містять якесь значення.
Багатовимірні масиви
Багатовимірні масиви — це по-суті масив з масивів. Наприклад, двовимірний масив можна передати через одновимірний масив, кожний елемент якого є масивом. Часто двовимірні масиви використовують, як таблиці. Приклад створення двовимірного масиву мовою програмування C++:
int N, M; cin >> N >> M; //зчитування змінних(розмірів масиву) int **p = new int *[N]; //створення масиву вказівників на одновимірні підмасиви for(int i = 0; i < N; i++) { p[i] = new int[M]; // створення одновимірного підмасиву } //Операції над масивом // . . . for(int i = 0; i < N; i++) { delete [] p[i]; //Видалення підмасивів } delete [] p; //Видалення масиву вказівників
Зміна розміру масиву
У випадку збільшення логічного розміру, може виникнути необхідність збільшення розміру масиву. При видаленні елементу, необхідно наступним до видаленого елементам присвоїти значення наступного, тобто зсунути елементи масиву вліво. При додаванні, щоб запобігти засміченню пам'яті при зміні розміру масиву багаторазово, його об'єм збільшують вдвічі з метою використання резервного простору для майбутніх операцій. Додавання пам'яті можна реалізувати наступним чином:
function insertEnd(dynarray a, element e) if (a.size = a.capacity) a.capacity ← a.capacity * 2 a[a.size] ← e a.size ← a.size + 1
Переваги та недоліки
- Можливість задавати розмір масиву під час виконання програми
- Можливість додавати елементи
- Засмічення пам'яті
- Під час зміни розміру масива, програма може суттєво гальмувати. Для великих об'ємів це може призвести до того що зависання буде відчувати користувач.
Реалізація
Підтримується в Delphi, Free Pascal, але не Turbo Pascal.
byteArray : Array of Byte; // Одновимірний масив multiArray : Array of Array of string; // Двовимірний масив
//Одновимірний масив з a елементів int *mas = malloc (sizeof(int) * a); // Виділення пам’яті // Двовимірний масив з N рядків по M елементів // Виділення пам’яті для масиву вказівників на одновимірні підмасиви int **A = (int **)malloc(N*sizeof(int *)); for(int i = 0; i < N; i++) { // Виділення пам’яті для одновимірного підмасиву A[i] = (int *)malloc(M*sizeof(int)); } // Звільнення пам'яті одновимірного масиву free(mas); // Звільнення пам'яті двовимірного масиву for(int i = 0; i < N; i++) { // Звільнення пам’яті одновимірного підмасиву free(A[i]); } // Звільнення пам’яті масиву вказівників на одновимірні підмасиви free(A);
// Створення одновимірного масиву int *mas = new int[a]; // Створення двовимірного масиву з N рядків по M елементів // Створення масиву вказівників на одновимірні підмасиви int **p = new int *[N]; for(int i=0; i < N; i++) { // Створення одновимірного підмасиву p[i] = new int[M]; } // Вилучення одновимірного масиву delete [] mas; // Вилучення двовимірного масиву for(int i=0; i < N; i++) { // Вилучення одновимірного підмасиву delete [] p[i]; } // Вилучення масиву вказівників на одновимірні підмасиви delete [] p;
program dynamic_arrays implicit none integer :: nx, n,m,i integer, allocatable, dimension(:) :: x,temp integer, allocatable, dimension(:,:) :: y nx=5 n=10 m=20 ! створення одновимірного масиву allocate(x(nx)) ! ініціалізація всього масиву x = 1 ! показуємо масив print*,'x = ', x print*, ' allocated(x)=',allocated(x) ! створення нового масиву вдвічі довшого за попередній allocate(temp(2*size(x))) ! ініціалізація всього масиву temp = -1 ! x видаляється і створюється вдвічі довший без копіювання даних, temp видаляється call move_alloc(temp,x) print*, ' allocated(temp)=',allocated(temp) ! показуємо масив print*,'x = ', x print*, ' allocated(x)=',allocated(x) ! вилучення одновимірного масиву deallocate(x) ! створення двовимірного масиву з m рядків по n елементів (в фортрані - спочатку по стовпцях!) allocate(y(n,m)) ! ініціалізація всього масиву do i =1,m y(:,i)=i end do ! показуємо масив print*,'y = ' do i=1,m print*, y(:,i) enddo ! вилучення двовимірного масиву deallocate(y) end program dynamic_arrays
Див. також
Джерела
- Томас Кормен; Чарльз Лейзерсон, Рональд Рівест, Кліфорд Стайн (2009) [1990]. 10. Елементарні структури даних. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
- VPOOL [ 1 жовтня 2014 у Wayback Machine.] - C language implementation of dynamic array.
- — A Java profiler with explicit support for debugging ArrayList- and Vector-related issues.
- Open Data Structures - Chapter 2 - Array-Based Lists [ 27 грудня 2013 у Wayback Machine.]
- Прата С. Мова програмування С++, - 6-те видання.-М. "Вильям", - Москва, 2012. - 374 с.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Dinamichnim nazivayut takij masiv rozmir yakogo mozhna zminyuvati pid chas vikonannya programi Dinamichni masivi nadayut zmogu bilsh gnuchko pracyuvati z danimi oskilki dozvolyayut vvoditi dovilnij rozmir Dlya zmini rozmiru dinamichnogo masivu mova programuvannya sho pidtrimuye taki masivi povinna nadavati vbudovanu funkciyu chi operator V porivnyani zi statichnim masivom dinamichnij ne maye fiksovanogo rozmiru ta mozhe zadavatis pid chas vikonannya programi Zamist vikoristannya zminnoyi tipu string mozhna vikoristovuvati masiv zminnih tipu char U zadachah pov yazanih z matricyami matrici zapisuyut yak dvovimirnij masiv V starih komp yuterah z maloyu kilkistyu operativnoyi pam yati a takozh pri operaciyah z velikoyu kilkistyu danih isnuye zagroza povnogo zasmichennya pam yati tomu v kinci programi prijnyato vidalyati masiv Dodavannya novih elementiv U vipadku yaksho rozmir masivu zamalij stvoryuyetsya novij vdvichi bilshij masiv elementam yakogo prisvoyuyutsya znachennya elementiv poperednogo masivuHarakteristikaRozmirnist kilkist indeksiv elementa odnovimirnij dvovimirnij bagatovimirnij Rozmir zagalna kilkist elementiv u masivi Logichnij rozmir kilkist elementiv masivu yaki mistyat yakes znachennya Bagatovimirni masiviBagatovimirni masivi ce po suti masiv z masiviv Napriklad dvovimirnij masiv mozhna peredati cherez odnovimirnij masiv kozhnij element yakogo ye masivom Chasto dvovimirni masivi vikoristovuyut yak tablici Priklad stvorennya dvovimirnogo masivu movoyu programuvannya C int N M cin gt gt N gt gt M zchituvannya zminnih rozmiriv masivu int p new int N stvorennya masivu vkazivnikiv na odnovimirni pidmasivi for int i 0 i lt N i p i new int M stvorennya odnovimirnogo pidmasivu Operaciyi nad masivom for int i 0 i lt N i delete p i Vidalennya pidmasiviv delete p Vidalennya masivu vkazivnikivZmina rozmiru masivuU vipadku zbilshennya logichnogo rozmiru mozhe viniknuti neobhidnist zbilshennya rozmiru masivu Pri vidalenni elementu neobhidno nastupnim do vidalenogo elementam prisvoyiti znachennya nastupnogo tobto zsunuti elementi masivu vlivo Pri dodavanni shob zapobigti zasmichennyu pam yati pri zmini rozmiru masivu bagatorazovo jogo ob yem zbilshuyut vdvichi z metoyu vikoristannya rezervnogo prostoru dlya majbutnih operacij Dodavannya pam yati mozhna realizuvati nastupnim chinom function insertEnd dynarray a element e if a size a capacity a capacity a capacity 2 a a size e a size a size 1Perevagi ta nedolikiMozhlivist zadavati rozmir masivu pid chas vikonannya programi Mozhlivist dodavati elementi Zasmichennya pam yati Pid chas zmini rozmiru masiva programa mozhe suttyevo galmuvati Dlya velikih ob yemiv ce mozhe prizvesti do togo sho zavisannya bude vidchuvati koristuvach RealizaciyaPascal Pidtrimuyetsya v Delphi Free Pascal ale ne Turbo Pascal byteArray Array of Byte Odnovimirnij masiv multiArray Array of Array of string Dvovimirnij masiv C Odnovimirnij masiv z a elementiv int mas malloc sizeof int a Vidilennya pam yati Dvovimirnij masiv z N ryadkiv po M elementiv Vidilennya pam yati dlya masivu vkazivnikiv na odnovimirni pidmasivi int A int malloc N sizeof int for int i 0 i lt N i Vidilennya pam yati dlya odnovimirnogo pidmasivu A i int malloc M sizeof int Zvilnennya pam yati odnovimirnogo masivu free mas Zvilnennya pam yati dvovimirnogo masivu for int i 0 i lt N i Zvilnennya pam yati odnovimirnogo pidmasivu free A i Zvilnennya pam yati masivu vkazivnikiv na odnovimirni pidmasivi free A C Stvorennya odnovimirnogo masivu int mas new int a Stvorennya dvovimirnogo masivu z N ryadkiv po M elementiv Stvorennya masivu vkazivnikiv na odnovimirni pidmasivi int p new int N for int i 0 i lt N i Stvorennya odnovimirnogo pidmasivu p i new int M Viluchennya odnovimirnogo masivu delete mas Viluchennya dvovimirnogo masivu for int i 0 i lt N i Viluchennya odnovimirnogo pidmasivu delete p i Viluchennya masivu vkazivnikiv na odnovimirni pidmasivi delete p Fortran program dynamic arrays implicit none integer nx n m i integer allocatable dimension x temp integer allocatable dimension y nx 5 n 10 m 20 stvorennya odnovimirnogo masivu allocate x nx inicializaciya vsogo masivu x 1 pokazuyemo masiv print x x print allocated x allocated x stvorennya novogo masivu vdvichi dovshogo za poperednij allocate temp 2 size x inicializaciya vsogo masivu temp 1 x vidalyayetsya i stvoryuyetsya vdvichi dovshij bez kopiyuvannya danih temp vidalyayetsya call move alloc temp x print allocated temp allocated temp pokazuyemo masiv print x x print allocated x allocated x viluchennya odnovimirnogo masivu deallocate x stvorennya dvovimirnogo masivu z m ryadkiv po n elementiv v fortrani spochatku po stovpcyah allocate y n m inicializaciya vsogo masivu do i 1 m y i i end do pokazuyemo masiv print y do i 1 m print y i enddo viluchennya dvovimirnogo masivu deallocate y end program dynamic arraysDiv takozhMasiv struktura danih Vektor C DzherelaTomas Kormen Charlz Lejzerson Ronald Rivest Kliford Stajn 2009 1990 10 Elementarni strukturi danih Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 VPOOL 1 zhovtnya 2014 u Wayback Machine C language implementation of dynamic array A Java profiler with explicit support for debugging ArrayList and Vector related issues Open Data Structures Chapter 2 Array Based Lists 27 grudnya 2013 u Wayback Machine Prata S Mova programuvannya S 6 te vidannya M Vilyam Moskva 2012 374 s