Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash - bet 38

Dekka taʻluqli bo‘lgan vektorlarning afzalligi.
To‘plamning o‘rtasida elementlarni qo‘shish va o‘chirish sekinroq amal hisoblanadi. Chunki bir o‘zgarish uchun barcha elementlarning o‘rinlarini almashtirish kerak bo‘ladi.
Vektorlar va deklarning iteratorlari erkin ruxsat turiga mansub.
Dek sinfi vektor sinfining funksiyalari bilan bir xil funksiyalarga ega. Dekning kamchiliklariga
Tez-tez qo‘shish yoki o‘chirish dekning boshida yoki oxirida sodir bo‘lishi.
Konteyner elementlariga havola qilaolmaysiz.
Konteyner ishlatilmay qolganda xotirani xoli qilish amalga oshirilishiga C++ qafolat bermaydi (amalga oshirish tamoyiliga qarab, xoli bo‘lshi va bo‘lmasligi ham mumkin)
Inobatga olishini kerak bo‘lgan holatlar:
Dekning at() boo‘qa biror bir funksiyasi iterator va indeksni tekshira olmaydi.
Qo‘shish va o‘chirish qo‘shimcha xotira talab qilish mumkin. Shuning uchun qo‘shish va o‘chirishga doir amallar bajarilganda dekning boshqa elementlari uchun ko‘rsatkichlar, havolalar va iteratorlarni aniq ko‘rsata olmaydi. Bunga istisno bo‘lib, Dekning boshiga yoki oxiriga element qo‘shish olinadi. Boshiga yoki oxiriga qo‘shilganda ko‘rsatkich va havolalar aniq bo‘ladi, ammo iterator yo‘q.
Dek va vektorning interfeyslari deyarli bir xil. Farqi shundaki, baʻzi bir funksiyalash yaratilgan bo‘lishi mumkin. Masalan, dek sinfi capacity, reserve kabi funksiyalarga ega emas. Buning sababi dek vektorlarga o‘xshab ishlashini yaxshilash kerak emas.
Deklar bilan ishlaganda, ayniqsa maʻlumotlarni qo‘shishda ko‘rsatkich va iteratorlarga bohliq dastur fragmenini yozishdan ehtiyot bo‘lish va mustaqil yozish kerakmas.
Umuman olganda, shaxsiy deklar bu vektorlardir, ular bilan ishlash ham vektorlar kabi amalga oshiriladi. Ammo qachon dekni, qachon vektorni tanlashni bilish kerak.
Maʻlumotlar tuzilmasining boshiga va oxiriga qo‘shish uchun optimizatsiyalangan (yaxshilangan, ixcham qilingan) vektor – bu dekdir. Bunda qo‘shish aniq o‘zgarmas vaqtda bajariladi va nusxalash konstruktorini bir marta chaqiradi.
Agar element dekning o‘rtasiga qo‘shilsa, eng yomoni bu amal vaqt talab qiladi, chunki qo‘shish nuqtadan boshigacha va oxirigacha bo‘lgan masofalar orasida kichik aniqlash lozim.
insert, push_front i push_back funksiyalari dekdagi hamma iteratorlarni bekor qilishi mumkin. Shuningdek dekning o‘rtasiga maʻlumot qo‘shilganda havolalarni xam bekor qiladi.
Berilgan navbatdagi elementlarni guruhlash masalasini qaraylik. Guruhlashni amalga oshirish uchun guruhlash shartini tanlaymiz va shu asosida navbat ichida guruhlaymiz, shartga tegishli bo‘lganlar navbat boshidan, bo‘lmaganlar oxiridan joylatiriladi.
4.8-dastur. Navbvtdagi elementlarni guruhlash.
// Created by MBBahodir #include "stdafx.h" #include #include #include using namespace std;
bool mypred(const int x){
return x <= 51; // guruhlash uchun shart
}
int main(){
int Arr[]={1,78,89,23,51,49,100,18,50};
deque d(&Arr[0],&Arr[9]);
cout << "Joriy deque: " << endl;
for (deque::iterator it=d.begin();it!=d.end();it++) std::cout<<*it<<" | "; cout << endl;
stable_partition(d.begin(),d.end(),mypred);
cout << "Natija: " << endl;
for (deque::iterator it=d.begin();it!=d.end();it++) std::cout<<*it<<" | "; cout << endl;
system("pause"); return 0;
}
4.8-dastur.Output
|
Joriy deque:
1 | 78 | 89 | 23 | 51 | 49 | 100 | 18 | 50 | Natija:
1 | 23 | 51 | 49 | 18 | 50 | 78 | 89 | 100 |
|
4.7-dasturdagi fragment asosiy guruhlash sharti hisoblanadi.
bool mypred(const int x){
return x <= 51; // guruhlash uchun shart
}
|
Bunda agar x <= 51 bo‘lsa true, aks holda flase qaytaradi. Bunga ekvivalent sifatida quyidagicha fragment ham yozish mumkin.
bool mypred(const int x){
if (x <= 51) return true; // guruhlash uchun shart return false;
}
|
Dek uchun keltirilgan materiallar dastlabki o‘rganuvchilar uchun yetarli deb hisoblaymiz. Masalaning shartiga qarab dek yoki vektorni tanlash dasturchining mahoratiga bog‘liq.
Dekning funksiyalariga quyidagilar kiradi:
4.1-jadval. Dekning funksiyalari
push_front
|
Boshidan yangi element qo‘shish
|
push_back
|
Oxiridan yangi element qo‘shish
|
pop_front
|
Birinchi elementni olish
|
pop_back
|
Oxirgi elementni olish
|
front
|
Birinchi element qiymatini ko‘rish
|
back
|
Oxirgi element qiymatini ko‘rish
|
size
|
Elementlar sonini ko‘rish
|
clear
|
Barcha elementlarni o‘chirish
|
|