Funksiyalar shablonlari
Ko'pgina algoritmlar ular bilan ishlaydigan ma'lumotlar tiplariga bog'liq emas (klassik misol - saralash). Algoritmni shunday parametrlash istagi mavjudki, uni ma'lumotlar turli tiplari uchun foydalanish mumkin bo'lsin. Birinchi xayolga keladigani – tip haqidagi ma'lumotni parametr sifatida uzatish (masalan, bir parametr bilan funksiyaga ma'lumotlarga ko'rsatgich, so'ngra – ma'lumotlar elementining baytlardagi uzunligi uzatiladi). Qo'shimcha parametrdan foydalanish qo'shimcha kodni hosil bo'lishini bildiradi, bu esa rekursiv chaqirishlarda va ichki sikllardagi chaqirishlarda dastur samaradorligini pasaytiradi, bundan tashqari, tiplarni nazorat etish imkoniyati yo'q. Boshqa yechim bo'lib, turli tipdagi ma'lumotlar bilan ishlash uchun bir nechta yuklanishli ortgan funksiyalarni yozish hisoblanadi, lekin bunday holda dasturda mantiq bo'yicha bir xil bir nechta funksiya bo'ladi va har bir uchun yangisini kiritishga to'g'ri keladi.
C++ da parametrlashning kuchli vositasi – shablonlar bor. Funksiyalar shablonlari va sinflar shablonlari mavjud. Funksiya shabloni yordamida turli tiplarga qo'llaniladigan algoritmni aniqlash mumkin, ma'lumotlarning konkret tipi esa funksiyaga kompilyatsiya bosqichida parametr ko'rinishida uzatiladi. Kompilyator avtomatik ravishda uzatilgan tipga mos to'g'ri kodni hosil qiladi. Shunday qilib, o'zini avtomatik yuklaydigan funksiya yaratiladi va bunda parametrlashga bog'liq qo'shimcha sarflarni o'z ichiga olmaydi.
Oddiy funksiya-shablonning formati:
template sarlavha {
/* funksiya jismi */
}
Type so'zi o'rniga ixtiyoriy nomdan foydalanish mumkin.
Umumiy holda funksiya shabloni har biri nafaqat tip balki o'zgaruvchidan, masalan:
template void f() { … }
iborat bir nechta parametrlarni o'z ichiga olishi mumkin.
Masalan, tanlash usuli bilan ixtiyoriy tipdagi n elementdan iborat massivni saralovchi funksiya shablon ko'rinishda quyidagicha shaklga ega:
template
void sort_vybor(Type *b, int n){
Type a; // elemenlarni almashish uchun buffer o'zgaruvchi
for (int I = 0; i int imin = i;
for (int j = i + 1; j if (b[j] < b[min]) imin = j;
a = b[i]; b[i] = b[imin]; b[imin] = a;
}
}
Bu funksiya-shablonni chaqiruvchi dasturning bosh funksiyasi quyidagi ko'rinishga ega bo'lishi mumkin:
#include
template void sort_vybor(Type *b, int n);
int main(){
const int n = 20;
int i, b[n];
for (i = 0; i> b[i];
sort_vybor(b, n); // Butun sonli massivni saralash
for (i = 0; i cout << endl;
double a[] = {0.22, 117, -0.08, 0.21, 42.5};
sort_vybor(a, 5); // haqiqiy sonlar massivini saralash
for (i = 0; i<5; i++) cout << a[i] << ' ';
return 0;
}
Ma'lumotlar konkret tipidan foydalanuvchi funksiyani birinchi chaqirish mos funksiya talqini uchun kompilyator kodini yaratishga olib keladi. Bu jarayon shablonni instansiyalash (instantiation) deb ataladi. Instansiyalash konkret tip yo kompilyator bilan avtomatik ravishda funksiyani chaqirishdan parametrlari tiplariga asoslanib aniqlanadi yoki oshkora beriladi. O'sha ma'lumotlar tipdagi qayta chaqirishda kod takroran hosil bo'lmaydi. Shablon parametric o'rniga konstant ifoda ko'rsatilishi lozim.
Chaqirishda shablon argumentlarini oshkora berish misoli:
template void f(Y, Z);
void g(){
f ( "Vasia", 3.0);
f ( "Vasia", 3.0); // Z double kabi aniqlanadi
f( "Vasia", 3.0); // Y char* kabi aniqlanadi, Z esa double kabi
// f( "Vasia", 3.0); xato: X ni toppish mumkin emas
}
Funksiya shablonni foydalanuvchi aniqlagan ma'lumotlar tipiga qo'llash usuli (Struktura yoki sinfga) funksiyada foydalaniladigan bu ma'lumorlar tipi uchun amallarni qayta tiklash talab etiladi.
Oddiy funksiyalar kabi funksiyalar shablonlar yordamida ham oddiy funksiyalar yordamida ham ortiqcha yuklanishi mumkin.
Ayrim parametrlar va tiplarni funksiya shablonini maxsuslashtirish yordamida maxsus qayta ishlashni ko'zda tutish mumkin. Faraz qilaylik, biz butun sonlar uchun saralash umumiy algoritmini samaraliroq amalga oshirishni xoxlaymiz. Bu holda butun sonlar bilan ishlash uchun funksiya shablonining variantini “qo'lda” berish mumkin.
void sort_vibor( int *b, int n){
… // funksiyaning maxsuslashgan variant jismi
}
Funksiya shabloni signaturasi nafaqat uning tipi va parametrlar tipini, balki shablonning mavjud argumentini ishga tushiradi. Odatdagi funksiya hech qachon nisbatan maxsuslashtirishi bilan hisoblashmaydi, shunga qaramay o'sha tip va qaytaruvchi qiymat tipiga ega bo'lishi mumkin.
Do'stlaringiz bilan baham: |