11-Variant
Nazariy qism
C++ tili qayta foydalaniluvchi dasturiy ta’minotni ishlab chiqish uchun shablon funksiyalar va sinflar bilan ta’minlaydi. Shablonlar funksiyalar va sinflarda turlarni muvofiqlashtirish (sozlash) qobiliyatini taqdim etadi. Bunday qobiliyat bilan, kompilyator aniq bir tur o`rnida qabul qila oladigan umumiy turga sifatida bitta funksiya yoki bitta sinfni aniqlashimiz mumkin.
Shablonlarsiz C++ da bir funksiyani turli xil tiplar ustida bajarish uchun har bir tur uchun alohida funcksiya yaratish kerak. Masalan(kiritilgan ifodani ekranga chiqarish):
#include
#include
using namespace std;
void Printf(float ifoda){
cout << "ifoda = " << ifoda << endl;
}
void Prints(string ifoda){
cout << "ifoda = " << ifoda << endl;
}
void Printi(int ifoda){
cout << "ifoda = " << ifoda << endl;
}
int main() {
Printi(2);
Prints("salom");
Printf(5.34);
return 0;
}
Shablon yordamida esa bitta funksiya yaratish yetarli bo’ladi:
#include
#include
using namespace std;
template
void Print(T ifoda){
cout<< "ifoda = " << ifoda << endl;
}
int main() {
Print(2);
Print("salom");
Print(5.34);
return 0;
}
Shablon yaratish uchun avval template so’zi yoziladi keyin <> ichida class yoki typname sozi va shablonning nomi yozilishi yetarli. Misol uchun: template ifoda G turini hosil qiladi va bu tur dastur davomida ixtiyoriy boshqa turga o’tishi mumkin.
Ya’ni G 5; ifodada G int tipi bajaradigan funksiyani bajarsa G “ajoyib” ifodada G string ga o’zgaradi.
Shablonlar turi aniq bo’lmagan o’zgaruvchilar bilan ishlashda qo’l keladi.
Shablonlar: template myobject();
Korinishida ham bo’lishi mumkin bu holda shablon faqat tur_nomi ifodada yozilgan turnigina qabul qilishi mumkin.
Shablonlar standart kutubxonasi.
Ba’zi dasturlash tillarida malumotlar tuzilmalari ustida amallar bajarishni osonlashitirish maqsadida shablonlar standard kutubxonasidan foydalaniladi. STL (shablonlar kutubxonasi) ni uch qismga ajratishimiz mumkin ular:
1.konteynerlar
2.algoritmlar
3.iteratorlar
Kiritilgan ma’lumotni daturlash tili o’qiy oladigan ko’rinishda qabul qilish va joylash uchun konteynerlardan foydalaniladi. Konteynerlar malum bir turdagi obeyktlar to’plamini boshqarish uchun ishlatiladi. Dek, stek, massiv, list, vector, map kabilarni konteynerlarga misol qilib keltirishimiz mumkin.
Konteynerlar ustida qandadaydur, masalan qidirish yoki saralash amalini bajarish uchun algoritmlardan foydalaniladi.
Iteratorlar esa konteynerlarning biror bir qismiga otish uchun foydalaniladi.
#include
#include
using namespace std;
int main() {
// vektor yaratamiz
vector vec;
int i; // vec nimg orginal olchamini chiqaramiz
cout << "vector size = " << vec.size() << endl;
// 5gaca sonlarni ni qoshamiz
for(i = 0; i < 5; i++) { vec.push_back(i); }
// keyingi o'lchamini chiqaramiz.
cout << "keyingi olcham = " << vec.size() << endl;
for(i = 0; i < 5; i++) {
cout << " vec [" << i << "] = " << vec[i] << endl; }
//iteratordan foydalanib vektor elementlariga kiramiz.
vector::iterator v = vec.begin();
while( v != vec.end()) {
cout << "v = " << *v << endl; v++;
}
return 0; }
Iteratorlarning ishlatilishi.
Shablonlar kutubxonasi konteynerlari joylashgan xotira adresini ko’rsatish uchun
Iteratorlardan foydalaniladi. ular dasturning kompayling vaqtini qisqartiradi.
Iteratorlardan foydalanish uchun dasturga #include qatorni qo’shish ya’ni iterator kutubxonasini chaqirish kerak.
begin() – bu funksiya konteynerning boshlangich pozitsiyasidagi ya’ni 1-elementni qaytaradi.
end() – bu funsiya konteyner oxirgi elementidan bitta keyingi adresni qaytaradi.
Iteratrolar 5 turga bo’linadi ular:
Kiritish,
Chiqarish,
Ulashish(forward)
Ikki yo’nalishli
Random access
Kiritish va chiqarish iteratorlari eng ko’p cheklangan iteratorlardur. Ular faqat bir tomonlama kiritish yoki chiqarish amallarini bajarishi mumkin.
konteyner
konteyner
Uchinchi tur iteratorlar kiritish dastlabki ikktasi bajaradigan funksiyalarni deyarli hammasini bajara oladi lekin ular ham faqat bir tomonlama.
konteyner
Ikki yonalishli iteratorlar ham forward iteratorlaga o’xshaydi faqat ular orqa tomondan ham konteynerga kirishi mumkin.
konteyner
Random access iteratorlari esa konteynerning ixtiyoriy qismidan kira oladi.
konteyner
Ikki yo’nalishli iteratorga misol:
#include
#include
#include
using namespace std;
int main() {
vector vec{10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
vector ::iterator it;
vector :: reverse_iterator rev_it;
for(it = vec.begin(); it != vec.end(); it++)
cout<<*it<<" "; cout<< endl;
for(rev_it = vec.rbegin();
rev_it!= vec.rend(); rev_it++)
cout<<*rev_it<<" ";
Do'stlaringiz bilan baham: |