MUSTAQIL ISH
Iteratorlar bilan ishlash va turlari
Guruh;TT2M21-01
Bajardi:Farmonov U.
Mavzu:Iteratorlar bilan ishlash va turlari
Reja;
1. Funktsiya shablonlari
2. Shablon argumentlari uchun standart qiymatni belgilashimiz mumkinmi?
Avvalo funksiya shablonlari bu umumiy turlar bilan ishlash mumkin bo’lgan
funksiyalardir.Shablon C++ tilida oddiy va shu bilan birga juda kuchli
vositadir.Oddiy g'oya ma'lumotlar turini parametr sifatida o'tkazishdir, shunda
biz turli xil ma'lumotlar turlari uchun bir xil kodni yozishimiz shart
emas.Masalan, dasturiy ta'minot kompaniyasiga turli xil ma'lumotlar turlari
uchun sort() kerak bo'lishi mumkin.Bir nechta kodlarni yozish va saqlash
o'rniga, biz bitta sort() yozishimiz va ma'lumotlar turini parametr sifatida
o'tkazishimiz mumkin.C++ shablonlarni qo'llab-quvvatlash uchun ikkita yangi
kalit so'zni qo'shadi: "template" va "typename". Ikkinchi kalit so'z har doim
"class" kalit so'zi bilan almashtirilishi mumkin.
Shablonlar qanday ishlaydi?
Shablonlar kompilyator vaqtida kengaytiriladi. Bu makrolarga o'xshaydi.
Farqi shundaki, kompilyator shablonni kengaytirishdan oldin turini tekshiradi.
G'oya oddiy, manba kodi faqat funksiya/sinfni o'z ichiga oladi, lekin tuzilgan kodda
bir xil funktsiya/sinfning bir nechta nusxalari bo'lishi mumkin.
Funktsiya shablonlari.Biz har xil ma'lumotlar turlari uchun ishlatilishi mumkin
bo'lgan umumiy funktsiyani yozamiz. Funktsiya shablonlariga misollar: sort(),
max(), min(), printArray().
max() - funksiyasi
sort() –funksiyasi
Sinf shablonlari.Funktsiya shablonlari kabi sinf shablonlari sinf ma'lumotlar
turidan mustaqil bo'lgan narsani aniqlaganda foydali bo'ladi. LinkedList,
BinaryTree, Stack, Queue, Array va boshqalar kabi sinflar uchun foydali bo'lishi
mumkin.
Quyida Array shablonlari sinfining oddiy misoli keltirilgan.
Shablonlarga bir nechta argumentlar bo'lishi mumkinmi?
Ha, oddiy parametrlar singari, shablonlarga argument sifatida bir nechta
ma'lumotlar turlarini o'tkazishimiz mumkin. Quyidagi misol buni ko'rsatadi
Shablon argumentlari uchun standart qiymatni belgilashimiz mumkinmi?
Ha, oddiy parametrlar singari, shablonlarga standart argumentlarni ham
belgilashimiz mumkin. Quyidagi misol buni ko'rsatadi.
STL ya'niy The Standart Template Library umumiy dasturlash maʼlumotlar
tuzilmalari va roʻyxatlar, steklar, massivlar va boshqalar kabi funksiyalarni
taʼminlash uchun C++ shablon sinflari toʻplamidir. Bu konteyner sinflari,
algoritmlar va iteratorlar kutubxonasi. Bu umumlashtirilgan kutubxona va shuning
uchun uning tarkibiy qismlari parametrlangan. Shablon sinflari bo'yicha ishchi
bilim STL bilan ishlash uchun zaruriy shartdir.
Algoritmlar.Sarlavha algoritmi, ayniqsa, elementlar diapazonlarida foydalanish
uchun mo'ljallangan funksiyalar to'plamini belgilaydi. Ular konteynerlarda ishlaydi
va konteynerlar mazmuni uchun turli operatsiyalar uchun vositalarni taqdim etadi.
Masalan: sort()
Saralash ma'lumotlarga qo'llaniladigan eng asosiy funktsiyalardan biridir. Bu
ma'lumotlarning ko'payishi yoki kamayishi mumkin bo'lgan ma'lum bir tarzda
tartibga solinishini anglatadi. C++ STL da sort() nomi bilan o'rnatilgan funksiya
mavjud.
Bu funksiya IntroSort-dan ichki foydalanadi. Batafsilroq u QuickSort, HeapSort va
InsertionSort gibridlari yordamida amalga oshiriladi. Odatiy bo'lib, u QuickSort-dan
foydalanadi, lekin agar QuickSort nohaq qismlarga bo'linsa va N*logN vaqtdan
ko'proq vaqt talab qilsa, u HeapSort-ga o'tadi va massiv o'lchami juda kichik
bo'lganda, u InsertionSort rejimiga o'tadi
Konteynerlar.Konteynerlar yoki konteyner sinflari ob'ektlar va ma'lumotlarni
saqlaydi. Jami yettita standart “birinchi toifa” konteyner sinfi va uchta konteyner
adapter sinfi va ushbu konteynerlar yoki konteyner adapterlariga kirishni
taʼminlovchi yettita sarlavha fayli mavjud.Ketma-ket konteynerlar: ketma-ket kirish
mumkin bo'lgan ma'lumotlar tuzilmalarini amalga oshirish.
vector
list
deque
arrays
forward_list (C++ 11 da kiritilgan)
Konteyner adapterlari: ketma-ket konteynerlar uchun boshqa interfeysni
ta'minlaydi.
queue
priority_queue
stack
Assotsiativ konteynerlar: tezda qidirilishi mumkin bo'lgan tartiblangan ma'lumotlar
tuzilmalarini amalga oshirish (O(log n) murakkabligi).
set
multiset
map
multimap
Tartibga solinmagan assotsiativ konteynerlar: tezda qidirilishi mumkin bo'lgan
tartibsiz ma'lumotlar tuzilmalarini amalga oshirish
unordered_set (C++ 11 da kiritilgan)
unordered_multiset (C++ 11 da kiritilgan)
unordered_map (C++ 11 da kiritilgan)
unordered_multimap (C++ 11 da kiritilgan)
Funksiyalar.STL funksiya chaqiruvi operatorini ortiqcha yuklaydigan sinflarni o'z
ichiga oladi. Bunday sinflarning misollari funksiya ob'ektlari yoki funktorlar deb
ataladi. Funktorlar o'tkaziladigan parametrlar yordamida bog'langan funktsiyaning
ishlashini moslashtirishga imkon beradi.Funktorlar funksiya emas. Faqat bitta
argumentni oladigan funktsiyani ko'rib chiqing. Biroq, ushbu funktsiyani
chaqirishda biz ushbu funktsiyaga o'tmoqchi bo'lgan juda ko'p ma'lumotlarga
egamiz, lekin biz buni qila olmaymiz, chunki u faqat bitta parametrni qabul qiladi.
Nima qilish mumkin? Aniq javoblardan biri global o'zgaruvchilar bo'lishi mumkin.
Biroq, yaxshi kodlash amaliyotlari global o'zgaruvchilardan foydalanishni qo'llab-
quvvatlamaydi va ular faqat boshqa muqobil bo'lmaganda foydalanish kerakligini
aytadi.
Funktorlar - bu funksiya yoki
funktsiya ko'rsatkichi sifatida ko'rib chiqilishi mumkin bo'lgan ob'ektlar. Funktorlar
ko'pincha STL bilan birgalikda quyidagi stsenariyda qo'llaniladi:
Iteratorlar.Nomidan ko'rinib turibdiki, iteratorlar qiymatlar ketma-ketligi ustida
ishlash uchun ishlatiladi. Ular STLda umumiylikka imkon beruvchi asosiy
xususiyatdir. Iteratorlar STL konteynerlarining xotira manzillariga ishora qilish
uchun ishlatiladi. Ular birinchi navbatda raqamlar, belgilar va boshqalar ketma-
ketlikda qo'llaniladi. Ular dasturning murakkabligi va bajarilish vaqtini qisqartiradi.
1. begin() - Bu funksiya konteynerning boshlanish holatini qaytarish uchun
ishlatiladi.
2. end() - Bu
funksiya konteynerning oxirgi holatini qaytarish uchun ishlatiladi.
// C++ code to demonstrate the working of
// iterator,
begin() and end()
#include
#include
//
for
iterators
#include
//
for
vectors
using namespace std;
int
main(){
vector ar =
{ 1, 2, 3, 4, 5 };
// Declaring iterator to a
vector
vector::iterator ptr;
//
Displaying
vector
elements
using
begin()
and
end()
cout << "The vector elements are : ";
for
(ptr = ar.begin(); ptr < ar.end(); ptr++)
cout <<
*ptr << " ";
return 0; }
3. advance() - Bu funksiya iterator oʻrnini argumentlarida koʻrsatilgan raqamgacha
oshirish uchun ishlatiladi.
4. next() - Bu funksiya iterator oʻz argumentlarida koʻrsatilgan pozitsiyalarni ilgari
surgandan soʻng koʻrsatadigan yangi iteratorni qaytaradi.
5. prev() - Bu funksiya iterator o'z argumentlarida eslatib o'tilgan pozitsiyalarni
kamaytirgandan keyin ko'rsatadigan yangi iteratorni qaytaradi.
6. inserter() :- Bu funksiya elementlarni konteynerning istalgan joyiga kiritish uchun
ishlatiladi. U 2 ta argumentni, konteyner va iteratorni elementlarni kiritish kerak
bo'lgan joyni qabul qiladi.
Std::find, std::equal, std::count kabi turli xil STL algoritmlarining shablon ta'rifini
ko'rib chiqqandan so'ng, siz Input Iterator tipidagi ob'ektlardan iborat shablon
ta'rifini topgan bo'lishingiz kerak. Xo'sh, ular nima va ular nima uchun ishlatiladi?
Input iteratorlari C++ standart kutubxonasida mavjud bo'lgan iteratorlarning
beshta asosiy turidan biri bo'lib, boshqalari Chiqish iteratorlari, Oldinga iterator,
Ikki yo'nalishli iterator va Tasodifiy kirish iteratorlaridir.
Input iteratorlari mavjud bo'lgan barcha iteratorlar orasida eng zaif va eng sodda
deb hisoblanadi, ularning funksionalligi va ular yordamida nimaga erishish
mumkin. Ular ketma-ket kiritish operatsiyalarida ishlatilishi mumkin bo'lgan
iteratorlar bo'lib, bunda iterator tomonidan ko'rsatilgan har bir qiymat faqat bir
marta o'qiladi va keyin iterator oshiriladi.
Std::copy, std::move, std::transform kabi turli xil STL algoritmlarining shablon
ta'rifini ko'rib chiqqandan so'ng, siz Output Iterator tipidagi ob'ektlardan iborat
shablon ta'rifini topgan bo'lishingiz kerak. Xo'sh, ular nima va ular nima uchun
ishlatiladi?
Output iteratorlari C++ standart
kutubxonasida mavjud bo'lgan iteratorlarning beshta asosiy turidan biri bo'lib,
boshqalari kirish iteratorlari, oldinga yo'naltiruvchi iteratorlar, ikki yo'nalishli
iteratorlar va tasodifiy kirish iteratorlaridir.Output iteratorlari kiritish iteratorlarining
teskari funksiyasini bajaradiganligi sababli, kirish takrorlovchilarining mutlaqo
teskarisi hisoblanadi. Ularga qiymatlar ketma-ketlikda tayinlanishi mumkin, lekin
qiymatlarga kirishning teskarisini bajaradigan va qiymatlarni belgilash mumkin
bo'lmagan kirish iteratorlaridan farqli o'laroq, qiymatlarga kirish uchun
foydalanilmaydi. Shunday qilib, input va ouput iteratorlari bir-birini to'ldiradi, deb
aytishimiz mumkin.
Std::search, std::search_n, std::lower_bound kabi turli xil STL algoritmlarining
shablon ta'rifini ko'rib chiqqandan so'ng, siz Forward Iterator tipidagi ob'ektlardan
iborat shablon ta'rifini topgan bo'lishingiz kerak. Xo'sh, ular nima va ular nima
uchun ishlatiladi?
Forward iteratorlar C++ standart
kutubxonasida mavjud boʻlgan iteratorlarning beshta asosiy turlaridan biri boʻlib,
boshqalari kirish iteratorlari, chiqish iteratorlari, ikki yoʻnalishli iteratorlar va
tasodifiy kirish iteratorlaridir. Forward iteratorlar kirish va chiqish iteratorlarining
kombinatsiyasi hisoblanadi. U ikkalasining funksionalligini qo'llab-quvvatlaydi. Bu
qiymatlarga kirish va o'zgartirish imkonini beradi.
Std::reverse, std::next_permutation va std::reverse_copy kabi turli xil STL
algoritmlarining shablon ta'rifini ko'rib chiqqandan so'ng, ularning ikki tomonlama
iterator tipidagi ob'ektlardan iborat shablon ta'rifini topgan bo'lishingiz kerak.
Xo'sh, ular nima va ular nima uchun ishlatiladi?
Bidirectional iteratorlar
C++ standart kutubxonasida mavjud boʻlgan iteratorlarning beshta asosiy
turlaridan biri boʻlib, boshqalari kirish iteratorlari, chiqish iteratorlari, Forward
iteratorlari va tasodifiy kirish iteratorlaridir.
Bidirectional iteratorlar - bu har ikki yo'nalishda (oxiriga va boshiga) diapazondagi
elementlar ketma-ketligiga kirish uchun ishlatilishi mumkin bo'lgan iteratorlar. Ular
oldinga iteratorlarga o'xshaydi, faqat oldinga yo'nalishda harakatlanishi mumkin
bo'lgan oldinga iteratorlardan farqli o'laroq, ular orqaga yo'nalishda ham
harakatlanishi mumkin.Shuni ta'kidlash kerakki, ro'yxat, xarita, multimap, to'plam
va multiset kabi konteynerlar bidirectional iteratorlarni qo'llab-quvvatlaydi. Bu
shuni anglatadiki, agar biz ular uchun oddiy iteratorlarni e'lon qilsak va ular
vektorlar va deque holatlarida bo'lgani kabi, ular ikki tomonlama iteratorlar bo'ladi,
ular tasodifiy kirish iteratorlaridir.
Do'stlaringiz bilan baham: |