|
Chiziqli konreynerlar (array, vector, deque, list, forward_list)
|
bet | 19/131 | Sana | 13.05.2024 | Hajmi | 1,83 Mb. | | #228405 |
Bog'liq Tiplarni dinamik tarzdaChiziqli konreynerlar (array, vector, deque, list, forward_list). Standart konteynerlarni ikkita katta guruhga chiziqli va assotsiativ konteynerlarga bo‘lishini bilamiz. O‘z navbatida chiziqli konteynerlarni bog‘langan ro‘yxat (forward_list va list) va tasodifiy kirish konteynerlariga (ekrin konteyner deb ham yuritiladi) (deque, vector va array) bo‘linadi.
Assotsiativ konteynerlar quyidagi variantlarning kombinatsiyasi bo‘lgan sakkizta konteyner bilan ifodalanadi (tegishli standart sinflar nomlarining qavslar ichida beriladi): to‘plam (*set) yoki lug‘at (*map), elementlarni takrorlashga imkon beruvchi (*multi*) yoki ruxsat bermaydigan, tartibga solingan solinmagan (unordered*).
Barcha konteynerlar iterator va const_iterator tiplari o‘z ichiga olish uchun o‘z navbatida o‘qish-yozish va faqat o‘qish iteratorlarini aniqlaydi. Konteyner tarkibida olgan iteratorlar oralig‘ini begin() va end() (o‘qish-yozish uchun iterator), shuningdek cbegin() va cend() (o‘qish uchun const_iterator) funksiyalari yordamida olish mumkin. Konteynerlar ikki tomonlama iteratorlar bilan ham teskari o‘tish uchun rbegin(), rend(), crbegin() va crend() funksiyalari mavjud.
Barcha konteynerlarni empty funksiyasi tomonidan bo‘sh uchun tekshirish mumkin. Qachonki cont.begin() == cont.end() bo‘lsa, o‘zgarmas konteyner bo‘sh hisoblanadi. end() konteynerning oxirgi elementi keyingi shartli elementga havola qiluvchi iteratorni qaytaradi. Elementlar sonini size() funksiyasi yordamida olish mumkin (forward_list bundan mustasno). Konteyner tarkibidagi funksiyalarni tozalash uchun clear() funksiyasidan foylalaniladi (array bundan mustasno).
Iteratorda begin(), end(), cbegin(), cend(), rbegin(), rend(), crbegin() va crend() erkin funksiyalarining shablonlarini aniqlash mumkin. Bular bir xil nomli funksiyalarga havola qilinadi, shuningdek, bunday aniqlangan funksiyalar statik massiv va std::valarray uchun aniqlandi. for(:) takrorlanish operatori xuddi shanday shakliga tayanadi. Masalan, cr bir konteyner bo‘lsin (shuningdek, statik massiv ham bo‘lishi mumkin), shunda dasturda for() fragmenti quyidagicha ishlatiladi.
Semantik jihatdan quyidagi fragmentga teng
{
using std::begin; using std::end;
const auto e = end(cr);
for (auto p = begin(cr); p != e; ++p)
{ T x = *p; work(x); }
}
|
Bu yerda T tipi konteyner elementlarining tipiga mos kelishi shart emas va auto asosida konstruksiya yoki havolali tip ham bo‘lishi mumkin (eng ko‘p ishlatiladigan variantlar auto& va auto&&).
Chiziqli konteynerlarni (array dan boshqa) belgilangan qiymatlardan assign() funksiyasini chaqirib to‘ldirish mumkin (eski qiymalari o‘chiriladi) va resize() funksiyasi bilan o‘lchamlarini (hajmi kamayganda elementlar oxiridan o‘chiriladi va hajmi ortganda, yangi elementlar oxiridan qo‘shiladi) aniqlash mumkin.
Konteynerning birinchi elementiga to‘g‘ridan-to‘g‘ri murojaat (tartiblanmagan assotsiativ konteynerlardan tashqari) front() funksiya yordamida amalga oshiriladi. Iteratorlari ikki tomonlama bo‘lgan barcha konteynerlarning oxirgi elementga murojaat uchun back() funksiyasi, shuningdek, teskari yo‘naltirilgan iteratorlar reverse_iterator va const_reverse_iterator funksiyalaridan foydalaniladi. Tegishli intervallarni rbegin(), rend() i crbegin(), crend() funksiyalari yordamida olish mumkin.
Barcha konteynerlarni tenglik va tengsizlik uchun taqqoslash mumkin va ularning mazmunini swap() funksiyasi yordamida almashtirish mumkin. Chegaralanmagan assotsiativlardan tashqari barcha konteynerlarni <, <= , > va >= operatorlari leksikografik jihatdan taqqoslash mumkin.
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.
|
| |