o’g’li (sirtqi) guruh
Dasturlash II fanidan Yakuniy nazorat savollari:
17-variant.
1.Bir aloqali ro‘yxatning nimalarini yaratish uchun A::rebind orqali yaratilgan allokatorday foydalaniladi?
2.Iteratorda begin(), end(), cbegin(), cend(), rbegin(), rend(), crbegin() va crend() erkin funksiyalari nimalarini aniqlashi mumkin?
3.Berilgan char turidagi to’plamning 1 ta so’zdan iborat elementlarini o’chiruvchi va 1 ta so’zdan iborat elementidan 2- to’plamni hosil qiluvchi hamda ularni ekranga chiqaruvchi dastur tuzing.
Javoblar:
1. Standart konteynerlarda dinamik xotirani boshqarish uchun Allocator ajratuvchi maxsus sinflardan foydalanadi. Allocator xotirani boshqarishning minimal birligini belgilaydigan va bir qator yordamchi taʻriflarni taqdim etadigan element tipiga bog‘liqdir. Bu vazifa to‘rt asosiy funksiyalari yordamida amalga oshiriladi: elementlari berilgan qator uchun xotira ajratishda allocate, xotirani tozalash uchun deallocate, konstruktor qurish uchun construct, va destruktor uchun destroy. Allokator boshqa tipdagi elementlar uchun analog allokator olishda rebind metafunksiyasini amalga oshirishi kerak.
Alloc – elementlarning aniq tiplari uchun allokator berilgan bo‘lsin. U tipli elementlar uchun uning allokatorini olish varianti quyidagi dastur fragmentida keltirilgan.
using AllocForU = typename Alloc::template rebind::other;
|
C++da standart kutubxona ( sarlavha fayl bilan) new/new[] va delete/delete[] operatorlarini qo‘llash orqali allocator ni taʻminlaydi. Bundan model va o‘zingizning allokatorlaringgizni yozishda foydalanish mumkin.
Bir aloqali ro‘yxat . forward_list> bir tomonlama iterator orqali T tipdagi elementlarga kirishni taʻminlaydi. Ro‘yxatning tugunlarini yaratish uchun A::rebind orqali yaratilgan allokatorday foydalaniladi. Bir aloqali ro‘yxatning o‘ziga xosligi shundaki, faqat belgilangan joriy tugundan keyin elementlarni qo‘shish va o‘chirish mumkin:
insert_after - element qo‘shish.
emplace_after – yangi element yaratish. Bunda belgilangan parametrlar uchun konstruktor chaqiriladi.
erase_after - element o‘chirish.
Birinchi elementdan oldin degan ko‘shimcha aniqlangan pozitsiya mavjud. Bu before_begin va cbefore_begin (const_iterator qaytaruvchilar uchun variant) funksiyalari yordamida bajariladi. Shuningdek, fl.push_front(item) funksiyasidan foydalanib, elementlarni oldindan joylashtirish mumkin (yuqoridagiga ekvivalent), masalan, quyidagicha dastur fragmenti:
fl.insert_after(fl.before_begin(), item)
|
Konstruktorga har qanday parametrlarni joylashtirish uchun fl.emplace_front(...) funksiyasi ishlatiladi. Bunga ekvivalent sifatida quyidagi dastur fragmentini yozish mumkin:
fl.emplace_after(fl.before_begin(), ...)
|
pop_front funksiyasi ro‘yxatdan birinchi elementni o‘chiradi.
C++ standart kutubxonasida ro‘yxat konteynerlar xususiyati uchun samarali bo‘lgan amallarni bajarishga faqat iteratorlarda foydalanishga ishonchsizligi yuqori darajali amallarni qo‘llab-quvvatlash hisoblanadi:
merge - ikkita tartiblangan ro‘yxatni bir-biriga birlashtiradi, elementlar ko‘chirilmaydi lekin o‘ngdan chap ro‘yxatga o‘tiladi
splice_after - berilgan ro‘yxatni ko‘rsatilgan elementdan keyin joylashtiradi.
remove – berilgan elementga teng bo‘lgan barcha elementlarni o‘chiradi.
remove – berilgan pridikat asosida barcha elementlarni o‘chiradi.
reverse – elementlarni tartibiga murojaat qiladi.
unique - barcha ketma-ket dublikatlarni o‘chiradi.
sort - ro‘yxatni joyida tartiblaydi.
Umuman olganda, bu funksiyalar qandaydir standart algoritmlarga o‘xshaydi, lekin juda tez va qulay ishlaydi. Ularga murojaat qilish uchun umumiy ruxsat olish kerak, masalan, sort() funksiyasi uchun std::sort(from, to). Ammo, tasodifiy kirish iteratorlari kabi talab qilingan ro‘yxatlar uchun amal qilmaydi.
2. Iteratorlar (iterators) – bu konteynerga nisbatan ko‘rsatkich sifatida bo‘lgan ob’ektlar. Ular massiv elementlariga ruxsat oluvchi ko‘rsatkichlar kabi, konteyner ichidagiga ruxsat olish imkoni beradi.
Itaratorlar bilan ko‘rsatkichlar kabi ishlash mumkin. Ularga *, inkrement, dekrement operatorlarni qo‘llash mumkin. Iterator tipi sifatida xar xil konteynerlarda aniqlangan iterator tip elon qilinadi. Itoratorlarning beshta tipi mavjud:
1. Kiritish iteratorlar (input_iterator) tenglik, nomini o‘zgartirish va inkrementa operatsiyalarni qo‘llaydi.
==, !=, *i, ++i, i++, *i++
Kiritish iteratsiyasining maxsus xolati istream_iterator iborat.
2. Chiqarish iteratorlar (output_iterator) o‘zlashtirish operatorning chap tarafidan imkon bo‘lgan isimning o‘zgartirish va inkrementa operatsiyalar qo‘llanadi.
++i, i++, *i=t, *i++=t
Chiqarish iteratsiyasining maxsus xolati ostream_iterator.
3. Bitta yo‘nalishdagi iteratorlar (forward_iterator) kiritish/chiqarish operatsiyalarning barchasini qo‘llaydi, bundan tashqari chegarasiz o‘zlashtirishning imkonini beradi.
==, !=, =, *i, ++i, i++, *i++
4. Ikki yo‘nalishdagi iteratorlar (biderectional_iterator) forward-iteratorlarning barcha xususiyatlariga ega, bundan tashqari, konteynerni ikkita yo‘nalishi bo‘yicha o‘tish imkonini beradigan qo‘shimcha dekrementa (--i, i--, *i--) operatsiyasiga ega.
5. Ixtiyoriy ruxsatga ega bo‘lgan iteratorlar (random_access_iterator) biderectional-iteratorlarning barcha xususiyatlariga ega, bundan tashqari solishtirish va manzil arifmetikasi operatsiyalarni qo‘llaydi.
i+=n, i+n, i-=n, i-n, i1-i2, i[n], i1i2, i1>=i2
Iteratorlarni olish usullari
begin() birinchi elementga ko‘rsatadi;
end() oxiridan keyingi elementga ko‘rsatadi;
rbegin() teskari ketma-ketlikdagi birinchi elementni ko‘rsatadi;
rend() teskari ketma-ketlikdagi oxirgidan keyingi elementni ko‘rsatadi Elementlarga ruxsat
front() birinchi elementga ilova;
Back() oxiri elementga ilova;
operator[](i) tekshirishsiz indeks bo‘yicha ruxsat;
at(i) tekshirish bilan indeks bo‘yicha ruxsat.
front() birinchi elementga ilova; Elementlarni kiritish usullari
insert(p,x) r ko‘rsatgan elementdan oldin xni qo‘shish
insert(p,n,x) rdan oldin xning n nusxalarini qo‘shish
insert(p,first,last) rdan oldin [first:last]dagi elementlarni qo‘shish
push_back(x) oxiriga xlarni qo‘shish
push_front(x) yangi birinchi elementni qo‘shish (ikta uchga ega bo‘lgan tartiblar va ro‘yxatlar uchun)
Elementlarni o‘chirish usullari
erase(p) r pozitsiyadagi elementni o‘chirish;
erase(first,last) [first:last]dan elementlarni o‘chirish;
pop_back() oxirgi elementni o‘chirish;
pop_front() birinchi elementni o‘chirish (ikta uchga ega bo‘lgan tartiblar va ro‘yxatlar uchun)
O‘zlashtirish usullari
operator=(x) konteynerga x konteynerni elementlari o‘zlashtiriladi;
3. Berilgan char turidagi to’plamning 1 ta so’zdan iborat elementlarini o’chiruvchi va 1 ta so’zdan iborat elementidan 2- to’plamni hosil qiluvchi hamda ularni ekranga chiqaruvchi dastur tuzing.
Do'stlaringiz bilan baham: |