logo

Standart algoritmlar. Iteratorlar va ularning qo‘llanilishi. Xotirani taqsimlovchilar va ularga qo‘yilgan talablar

Yuklangan vaqt:

21.11.2024

Ko'chirishlar soni:

0

Hajmi:

1304.0009765625 KB
D A S T U R L A S H 1 1DASTURLASH 2 Standart algoritmlar. Iteratorlar va ularning qo‘llanilishi. Xotirani taqsimlovchilar va ularga qo‘yilgan talablar. Standart bo‘yicha taqsimlovchi05 MAVZU D A S T U R L A S H 2Mа’ruza rejasi 2Standart bo‘yicha taqsimlovchi 4 Standart algoritmlar.1 Identifikatorlar, Iteratorlar va ularning qo‘llanilishi.2 Xotirani taqsimlovchilar va ularga qo‘yilgan talablar.3 D A S T U R L A S H 2Standart algoritmlar 3Standart shablon kutubxonasi ( Standard Template Library-STL ) : algoritmlar <algoritm> C++ standart shablon kutubxonasi(Standard Template Library-STL)dagi elementlar diapazonida foydalanish uchun maxsus ishlab chiqilgan funksiyalar to&#39;plamini o’zida saqlaydi. D A S T U R L A S H 2Standart algoritmlar 4Diapazon bu iterator yoki ko’rsatkichlar orqali kirish mumkin bo&#39;lgan ob&#39;ektlarning har qanday ketma-ketligi, masalan, array yoki ba&#39;zi  STL konteynerlarining  namunalari . Shunga e&#39;tibor beringki, algoritmlar iteratorlar orqali to&#39;g&#39;ridan-to&#39;g&#39;ri qiymatlarga ta&#39;sir qiladi, mumkin bo&#39;lgan konteynerning tuzilishiga hech qanday ta&#39;sir ko&#39;rsatmaydi (bu hech qachon konteynerning o&#39;lchamiga yoki saqlash joyiga ta&#39;sir qilmaydi). Bu funksiyalar quyidagilardir: D A S T U R L A S H 2 5Funksiya Ta&#39;rif all_of   Quyidagi funksiya diapazondagi barcha elementlarning holatini tekshirib ko&#39;radi. any_of()   Quyidagi funksiya diapazondagi ba&#39;zi yoki har qanday elementlarning holatini tekshiradi none_of()   Quyidagi funksiya elementlarning hech biri shartga mos kelmasligini tekshiradi. for_each() Funksiya diapazonning barcha elementlarini operatsiyalarida murojaat qiladi find() Funksiya diapazondan qiymat topadi.J oylashish tartibini o’zgartirmaydigan funksiyalar D A S T U R L A S H 2Tartibga solish operatsiyalarini o&#39;zgartirish 6Funktsiya Ta&#39;rif all_of Quyidagi funktsiya diapazondagi barcha elementlarning holatini tekshirib ko&#39;radi. any_of() Quyidagi funktsiya diapazondagi ba&#39;zi yoki har qanday elementlarning holatini tekshiradi none_of() Quyidagi funktsiya elementlarning hech biri shartga mos kelmasligini tekshiradi. find Funktsiya diapazondan qiymat topadi. find_end Funktsiya diapazonning oxirgi elementini qaytarish uchun ishlatiladi. find_first_of Funktsiya shartni qanoatlantiradigan birinchi elementni topadi. for_each Funktsiya diapazonning barcha elementlarini operatsiyalarida murojaat qiladi count Funktsiya diapazondagi qiymatning sonini qaytaradi. count_if Funktsiya shartni qanoatlantiradigan qiymatlar sonini qaytaradi. D A S T U R L A S H 2Tartibga solish operatsiyalarini o&#39;zgartirish 7Funktsiya Ta&#39;rif copy Funksiya elementlarning diapazonlaridan nusxa ko&#39;chiradi. move Funksiya diapazonning elementlarini siljitadi. swap Funksiya ikkita ob&#39;ektning qiymatini almashtiradi. replace Funksiya diapazondagi qiymatlarni ma&#39;lum bir qiymat bilan almashtiradi. fill Funksiya diapazondagi qiymatlarni qiymat bilan to&#39;ldiradi. generate Funksiya diapazon qiymatlarini generatsiyalash uchun ishlatiladi. remove Funksiya diapazondan qiymatlarni olib tashlaydi. unique Funksiya diapazonning noyob elementini aniqlaydi. reverse Funksiya diapazonni teskariga o&#39;zgartiradi. rotate Funksiya diapazon elementlarini chap yo&#39;nalishda aylantiradi. shuffle Funksiya tasodifiy ravishda generator yordamida diapazonni aralashtiradi. D A S T U R L A S H 2C ++ da Iteratorlar 8Iteratorlar xuddi konteyner elementlariga kirishda ishlatiladigan ko&#39;rsatgichlarga o&#39;xshaydi. Muhim fikrlar: Iteratorlar bir elementdan ikkinchisiga o&#39;tish uchun ishlatiladi, jarayon  konteyner orqali iteratsiya  deb nomlanadi . Iteratorning asosiy ustunligi shundaki, barcha konteynerlar turiga umumiy interfeys taqdim etiladi. Iteratorlar ishlatiladigan konteynerning turiga bog&#39;liq emas, ularda algoritm mustaqil . Iteratorlar konteyner elementlari bo&#39;ylab harakatlanish uchun umumiy yondashuvni ta&#39;minlaydi. Sintaksis <ContainerType> :: iterator;   <ContainerType> :: const_iterator;  D A S T U R L A S H 2Iteratorlar va ularning qo‘llanilishi. 9Iteratorlar konteynerlarning elementlariga murojaat qilish uchun foydalaniladi. Iteratorlar yordamida elementlar bilan ishlash juda qulay hisoblanadi. Iterator iterator tipi bilan yoziladi. Har qanday konteyner uchun iteratorlarning tiplari farq qiladi. Masalan, list<int>   tipidagi konteyner uchun list<int>::iterator tipi, vector<int>   tipidagi konteyner uchun esa vector<int>::iterator   tipi ishlatiladi. C++ tilida konteynerlardan iteratorlarni ajratib olish uchun begin()   va   end() funksiyalaridan foydalaniladi. D A S T U R L A S H 2Iterator yaratishga misol 10std::vector<int> v = { 1,2,3,4 }; std::vector<int>::iterator iter = v.begin();  Bu misolda tipiga mansub bo‘lgan vektor tipidpgi konteyner - vektor yaratilgan. Konteyner doimiy qiymatlar bilan to‘ldirilgan. begin()   funksiyasi (usuli) bilan vektor elementini olish uchun iterator keltirilgan. Bu iterator vektor konteynerning birinchi elementini ko‘rsatadi. D A S T U R L A S H 2Iteratorlarda amallari 11- *iter – iterator ko‘rsatadigan elementni olish; - ++iter - keyingi elementga murojat qilish uchun iteratorni harakatlantirish - --iter - oldingi elementga murojjat qilish uchun iteratorni harakatlantirish. forward_list konteyner iteratorlari dekrement amalini qo‘llab quvvatlamaydi. - iter1 == iter2 - ikki iterator teng, agar ular bir xil iteratorni aniqlagan bo‘lsa. - iter1 != iter2 ikki iterator teng emas, agar ular bir xil iteratorni aniqlagan bo‘lsa. D A S T U R L A S H 2Iteratorga oddiy misol 12 D A S T U R L A S H 2Iterator amallaridan foydalanish. 13Konteynerlar bilan ishlaganda, konteynerdagi elementlarni qo‘shish yoki o‘chirish ushbu konteyner uchun barcha joriy iteratorlarni, shuningdek, uning elementlariga havola va ko‘rsatgichlarni bekor qilishiga olib kelishi mumkin. Iteratorlar nafaqat elementlarni olish, balki ularni o‘zgartirish imkonini beradi. D A S T U R L A S H 2Iterator toifalari 14• Kirish(Input) iteratori • Chiqish(Output) iteratori • Oldinga yo&#39;naltiruvchi (Forward) iteratori • Ikki tomonlama(Bidirectional) iteratori • Tasodifiy kirish(Random Access) iteratoriIteratorni quyidagi yo&#39;llar bilan tasniflash mumkin: D A S T U R L A S H 2Kirish(input) iteratori 15Kirish(input)   iteratori:  Kirish iteratori bu konteynerdan elementlarga kirish uchun ishlatiladigan iterator, ammo u konteynerning qiymatini o&#39;zgartirmaydi. Kirish iteratori uchun ishlatiladigan operatorlar: o Increment operatori (++) o Teng operatori (==) o Teng emas operatori (! =) o Dereference  operatori (*) D A S T U R L A S H 2Kirish(input) iteratori 16 D A S T U R L A S H 2Chiqish(Output) iteratori 17Chiqish(Output)   iteratori   :  Chiqish iteratori bu konteyner qiymatini o&#39;zgartirish uchun ishlatiladigan iterator, ammo u konteynerdan qiymatni o&#39;qimaydi. Shuning uchun biz chiqish iteratorini  faqat yozuvchi iterator  deb aytishimiz mumkin . Chiqish iteratori uchun ishlatiladigan operatorlar quyidagilar:  Inkrement operatori (++)  Tayinlash yoki o’zlashtirish operatori (=) Chiqish İteratorining ikkita asosiy kichik klassi mavjud:  insert iterator  ostream iterator D A S T U R L A S H 2Misollar 18 D A S T U R L A S H 2Oldinga yo&#39;naltiruvchi(forward) iterator 19Oldinga yo&#39;naltiruvchi(forward)   iterator   : Oldinga yo&#39;naltiruvchi iterator - bu konteynerga o&#39;qish va yozish uchun ishlatiladigan iterator. Bu ko&#39;p o&#39;tishli iterator. Oldinga yo&#39;naltirish iteratori uchun ishlatiladigan operatorlar: • Inkrement operatori (++) • Tayinlash operatori (=) • Teng operatori (==) • Teng emas operatori (! =) D A S T U R L A S H 2 20Oldinga yo&#39;naltiruvchi(forward) iteratorga misol D A S T U R L A S H 2Ikki tomonlama(Bidirectional ) iterator 21Ikki tomonlama(Bidirectional ) iterator:  Ikki tomonlana iterator - bu iterator oldinga yo&#39;naltirish iteratorining barcha xususiyatlarini qo&#39;llab- quvvatlaydi va yana bir xususiyatni, ya&#39;ni dekrement operatori (--)ni qo&#39;shadi. Biz iteratorni dekrementlash orqali orqaga siljishimiz mumkin. Ikki tomonlama iterator uchun ishlatiladigan operatorlar:  Inkrement operatori (++)  Tayinlash operatori (=)  Teng operator (==)  Teng emas operator (! =)  Dekrement operatori (--) D A S T U R L A S H 2Ikki tomonlama iterator uchun oddiy misol 22 D A S T U R L A S H 2 23Tasodifiy kirish(Random Access) iteratori Tasodifiy kirish(Random Access) iteratori:  Tasodifiy kirish iteratori- bu iterator tasodifiy tarzda elementga tasodifiy kirishni ta&#39;minlaydi. U ikki tomonlama iteratorning barcha xususiyatlariga ega va yana bitta xususiyatni, ya&#39;ni elementga tasodifiy kirishni ta&#39;minlash uchun ko&#39;rsatgich qo&#39;shish va ko&#39;rsatgichni ajratishni qo&#39;shadi. D A S T U R L A S H 2 24KONTEYNER QO’LLAB QUVVATLOVCHI ITERATOR TURLARI Vector Random-Access List Bidirectional Deque Random-Access Map Bidirectional Multimap Bidirectional Set Bidirectional Multiset Bidirectional Stack Iteratorni qo’llab quvvatlamaydi Queue Iteratorni qo’llab quvvatlamaydi Priority-Queue Iteratorni qo’llab quvvatlamaydiIteratorlarning konteynerlarda qo’llab quvvatlanishi D A S T U R L A S H 2 25Iteratorning kamchiliklari • Agar biz bir vaqtning o&#39;zida bitta ma&#39;lumot strukturasidan ikkinchisiga o&#39;tishni istasak, iteratorlar ishlamaydi. • Agar biz iteratsiya qilinadigan tuzilmani yangilamoqchi bo&#39;lsak, unda iterator bizga pozitsiyani qanday saqlaganligi sababli buni qilishga imkon bermaydi. • Agar biz ro&#39;yxatni qayta ishlash paytida orqaga qaytishni xohlasak, bu holda iterator ishlamaydi. D A S T U R L A S H 2Iteratorning afzalliklari 26Iteratorning afzalliklari quyidagilardan iborat: Dasturlashda qulaylik:  konteyner elementlariga kirish uchun [] subscript operatorini ishlatishdan ko&#39;ra iteratorlardan foydalanish qulay. Agar elementlarga kirish uchun biz subskript operatoridan foydalansak, ish vaqti davomida qo&#39;shilgan elementlar sonini hisobga olishimiz kerak, ammo bu iterator holatida shart bo’lmaydi. D A S T U R L A S H 2 27Tasodifiy kirish iteratori va boshqa iteratorlarning eng muhim, farqi shundaki,  tasodifiy kirish iteratori elementga kirish uchun &#39;1&#39; bosqichni, boshqa iteratorlar esa &#39;n&#39; bosqichlarni talab qiladi  .Tasodifiy kirish iteratori va boshqa iteratorlarning farqi D A S T U R L A S H 2 28C/C++ da malloc (), calloc (), free () va realloc () dan foydalanib dinamik xotirani taqsimlash. C/C++ strukturalangan til bo&#39;lganligi sababli dasturlash uchun bir qator qat&#39;iy qoidalarga ega. Ulardan biri array(massiv)ning o&#39;lchamlarini o&#39;zgartirishni o&#39;z ichiga oladi. Array bu doimiy xotiraning adreslarida saqlanadigan elementlar to&#39;plamidir.Xotira taqsimlovchilar va ularga qo’yilgan talablar. D A S T U R L A S H 2 29Ko&#39;rinib turibdiki, yuqorida ko&#39;rsatilgan massivning uzunligi (o&#39;lchami) 9. Ammo bu uzunlikni (o&#39;lchamni) o&#39;zgartirish zarurati bo&#39;lsa nima bo&#39;ladi. Masalan:Xotira taqsimlovchilar va ularga qo’yilgan talablar. D A S T U R L A S H 2 30Agar ushbu massivga faqat 5 ta elementni kiritish kerak bo&#39;lgan vaziyat mavjud bo&#39;lsa. Bu holda, qolgan 4 ta indeks shunchaki ushbu massivda xotirani ortiqcha egallab turadi. Shunday qilib, massivning uzunligini (o&#39;lchamini) 9 dan 5 gacha kamaytirish talab etiladi. Boshqa vaziyatni ko&#39;rib chiqamiz. Bunda barcha 9 ta indeks bilan to&#39;ldirilgan 9 ta elementdan iborat massiv mavjud. Ammo bu massivga yana 3 ta elementni kiritish kerak. Bunday holda 3 ta indeks ko&#39;proq talab qilinadi. Shunday qilib, massiv uzunligini (o&#39;lchami) 9 dan 12 gacha o&#39;zgarishi kerak. Ushbu jarayon  C/C++ da dinamik xotirani taqsimlash  deb nomlanadi . Shuning uchun, C++ da  dinamik xotirani taqsimlash  protsedura sifatida aniqlanishi mumkin, bunda ma&#39;lumotlar strukturasi (Array kabi) ish vaqti davomi(runtime)da o&#39;zgaradi.Xotira taqsimlovchilar va ularga qo’yilgan talablar. D A S T U R L A S H 2 31Ushbu vazifalarni bajarish uchun C++ ba&#39;zi funksiyalarga ega. C/C++ dasturlashda dinamik xotirani taqsimlash osonlashtirish uchun  <stdlib.h>  sarlavha  faylida  belgilangan C+ + tomonidan taqdim etilgan 4 kutubxona funktsiyalari mavjud . Ular: • malloc() • calloc() • free() • realloc()C/C++ da malloc (), calloc (), free () va realloc () dan foydalanib dinamik xotirani taqsimlash. D A S T U R L A S H 2C++ malloc () metodi 32&#34; malloc &#34; yoki &#34; xotira ajratish &#34; metodi belgilangan hajmga ega bo&#39;lgan bitta katta hajmli xotirani dinamik ravishda ajratish uchun ishlatiladi. U har qanday shakldagi ko&#39;rsatgichga o’tkazilishi mumkin bo&#39;lgan void tipidagi ko&#39;rsatgichni qaytaradi. Sintaksis: ptr = (cast-type*) malloc(byte-size) D A S T U R L A S H 2C++ malloc () metodi 33 D A S T U R L A S H 2C++ calloc () metodi 34Belgilangan turdagi xotira bloklarining belgilangan sonini dinamik ravishda ajratish uchun C++ dagi &#34; calloc &#34; yoki &#34; yonma-yon taqsimlash &#34; usuli qo&#39;llaniladi. U har bir blokni standart &#34;0&#34; qiymati bilan ishga tushiradi. Sintaksis: ptr = (cast-type*)calloc(n, element-size); D A S T U R L A S H 2C++ calloc () metodi 35 D A S T U R L A S H 2C++ free () metodi 36C++dagi  &#34;free&#34;  metodi xotirani dinamik  ajratish  uchun ishlatiladi . Malloc () va calloc () funktsiyalari yordamida ajratilgan xotira mustaqil ravishda ajratilmaydi. Demak, dinamik xotirani ajratish sodir bo&#39;lganda, free () metodi ishlatiladi. Bu xotirani bo&#39;shatish orqali isrofgarchilikni kamaytirishga yordam beradi. Sintaksis: free (ptr); D A S T U R L A S H 2C++ free () metodi 37 D A S T U R L A S H 2C++ free () metodi 38C++dagi  &#34;free&#34;  metodi xotirani dinamik  ajratish  uchun ishlatiladi . Malloc () va calloc () funktsiyalari yordamida ajratilgan xotira mustaqil ravishda ajratilmaydi. Demak, dinamik xotirani ajratish sodir bo&#39;lganda, free () metodi ishlatiladi. Bu xotirani bo&#39;shatish orqali isrofgarchilikni kamaytirishga yordam beradi. Sintaksis: free (ptr); D A S T U R L A S H 2C++ free () metodi 39 D A S T U R L A S H 2C++ realloc() metodi 40&#34;realloc &#34;  yoki  &#34;qayta taqsimlash&#34;  metodi C++da ilgari ajratilgan xotirani ajratishni dinamik ravishda o&#39;zgartirish uchun ishlatiladi. Boshqacha qilib aytganda, agar malloc yoki calloc yordamida oldindan ajratilgan xotira yetarli bo&#39;lmasa,  xotirani dinamik ravishda qayta taqsimlash uchun reallocdan  foydalanish mumkin . Sintaksis: ptr = realloc(ptr, newSize);bu yerda ptr yangi o&#39;lchamda &#39;newSize&#39; bilan taqsimlanadi. D A S T U R L A S H 2C++ realloc() metodi 41 D A S T U R L A S H 2C++ realloc() metodi 42 D A S T U R L A S H 2XULOSA 43• Hayotda masalalarni yechishda uning algoritmini tuzishdan boshlash maqsadga muvofiq bo’ladi. Masala algoritmni tuzgan shaxs istalgan dasturlashda masalani yechish mumkin bo’ladi, albatta undan shu dasturlash tili sintaksisini bilish kifoya qiladi. • Masalani yechish algoritmni tuzish, so’zlar, matematik formulalar, grafiklar va jadvallar asosida amalga oshirish mumkin. • Algoritmlarni chiziqli, tarmoqlanuvchi va takrorlanuvchi ko’rinishda ifodalash mumkin. D A S T U R L A S H 2Foydalanilgan adabiyotlar 44• https://www.javatpoint.com/ • https://www.geeksforgeeks.org/ • http://www.cplusplus.com/ • https://metanit.com/ D A S T U R L A S H 1 45E’TIBORINGIZ UCHUN RAXMAT!