Dinamik massivlar
O'zgaruvchanlarni dinamik ravishda taqsimlash bilan bir qatorda biz massivlarni ham dinamik ravishda taqsimlashimiz mumkin. Uning kattaligi kompilyatsiya vaqtida ma'lum bo'lishi kerak bo'lgan sobit qatordan farqli o'laroq, C ++ da massivlarni dinamik ajratish uning uzunligini ish vaqtida belgilashga imkon beradi.
Mundarija:
Dinamik massivlar
Dinamik qatorni olib tashlash
Dinamik massivlarni ishga tushirish
Massivlar uzunligini o'zgartirish
Sinov
Dinamik massivlar
Dinamik massivni ajratish va u bilan ishlash uchun yangi va o'chirish operatorlarining alohida shakllari qo'llaniladi: yangi [] va o'chirish [].
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include
int main()
{
std::cout << "Enter a positive integer: ";
int length;
std::cin >> length;
int *array = new int[length]; // massiv ajratish uchun new [] operatoridan foydalanamiz. E'tibor bering, uzunlik doimiy bo'lishi shart emas!
std::cout << "Men faqat uzunlikdagi bir qatorni ajratdim"<< length << '\n';
array[0] = 7; // elementni 0 dan 7 gacha indeksda belgilang
delete[] array; // massivga ajratilgan xotirani bo'shatish uchun delete [] operatoridan foydalaning
array = 0; // C ++ 11 da 0 o'rniga nullptr dan foydalaning
return 0;
}
|
Biz qatorni ajratayotganimiz sababli, C ++ yangi operatorning boshqa shakli - o'zgaruvchini emas, balki massiv formasini ishlatishi kerakligini tushunadi. Aslida, yangi [] operatori chaqiriladi, hatto yangi kalit so'zdan keyin darhol [] ko'rsatmasak ham.
dinamik massivlar
Agar siz 0 qiymatiga ega bo'lgan dinamik qatorni ishga tushirishni xohlasangiz, unda hamma narsa juda oddiy:
1
|
int *array = new int[length]();
|
C ++ 11 dan oldin nolga teng bo'lmagan qiymatlar bilan dinamik qatorni ishga tushirishning oson usuli yo'q edi (boshlang'ich ro'yxati faqat sobit massivlar bilan ishlagan). Bu shuni anglatadiki, massivning har bir elementi ustida takrorlash va unga aniq qiymat berish kerak:
1
2
3
4
5
6
|
int *array = new int[5];
array[0] = 9;
array[1] = 7;
array[2] = 5;
array[3] = 3;
array[4] = 1;
|
Biroz charchagan, shunday emasmi?
Biroq, C ++ 11 dan boshlab, boshlang'ich ro'yxatlari orqali dinamik massivlarni ishga tushirish mumkin bo'ldi:
1
2
|
int fixedArray[5] = { 9, 7, 5, 3, 1 }; // sobit qatorni ishga tushirish
int *array = new int[5] { 9, 7, 5, 3, 1 }; // dinamik qatorni ishga tushirish
|
Qator uzunligi va boshlang'ich ro'yxati o'rtasida dinamik qator sintaksisida tayinlash operatori (=) mavjud emasligiga e'tibor bering.
C ++ 11 da sobit massivlarni bir xil boshlanish yordamida boshlash mumkin:
1
2
|
int fixedArray[5] { 9, 7, 5, 3, 1 }; // инициализируем фиксированный массив в C++11
char fixedArray[14] { "Hello, world!" }; // инициализируем фиксированный массив в C++11
|
Biroq, ehtiyot bo'ling, chunki C ++ 11 da siz C uslubidagi qator bilan dinamik belgilar qatorini ishga tushirolmaysiz:
1
|
char *array = new char[14] { "Hello, world!" }; // не работает в C++11
|
Buning o'rniga siz std :: stringni dinamik ravishda ajratishingiz mumkin (yoki dinamik belgilar qatorini ajratishingiz va keyin kerakli qator tarkibini shu qatorga ko'chirish uchun strcpy_s () funktsiyasidan foydalanishingiz mumkin). Iltimos, diqqat qiling, dinamik massivlar ularning uzunligini aniq ko'rsatgan holda e'lon qilinishi kerak:
1
2
3
4
5
|
int fixedArray[] {1, 2, 3}; // ок: неявное указание длины фиксированного массива
int *dynamicArray1 = new int[] {1, 2, 3}; // не ок: неявное указание длины динамического массива
int *dynamicArray2 = new int[3] {1, 2, 3}; // ок: явное указание длины динамического массива
|
Massivlar uzunligini o'zgartirish
Massivlarni dinamik taqsimlash ajratish paytida ularning uzunligini belgilashga imkon beradi. Biroq, C ++ allaqachon ajratilgan qator uzunligini o'zgartirish uchun ichki usulni taqdim etmaydi. Ammo hatto ushbu cheklovni yangi qatorni dinamik ravishda ajratish, barcha elementlarni eski massivdan nusxalash va keyin eski qatorni o'chirish yo'li bilan chetlab o'tish mumkin. Ammo, bu usul xatoga yo'l qo'yadi (bu haqda keyinroq).
Yaxshiyamki, C ++ da vektorlar (std :: vector) deb nomlanadigan o'lchamlari o'zgaruvchan massivlar mavjud. Ular haqida tegishli darsda gaplashamiz.
Do'stlaringiz bilan baham: |