• Funktorlarning ko‘llanilishi.
  • Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash




    Download 0,81 Mb.
    bet40/143
    Sana20.07.2024
    Hajmi0,81 Mb.
    #268096
    1   ...   36   37   38   39   40   41   42   43   ...   143
    Bog'liq
    Tiplarni dinamik tarzda-fayllar.org





    4.10-dastur. Output


    boʻsh joylar soni: 6 (7 soʻz) belgilar uzunligi: ' ' ... 'z'


    Muminov nuvmMoi ioMmvun mvunioM
    umumiy belgi 2 : io
    unikal belgi 5 : Mmnuv

    Dasturda char uchun konteynerlardan foydalanilgan. Deyarli barcha berilgan konteynerlar uchun turli xil algoritmlar amalga oshirilgan. (ixcham, ammo zerikarli fragmentlar).

    Funktorlarning ko‘llanilishi. Funktor so‘zi C++ da “funksional obʻyektlar” ning qisqartmasidan olingan. C++ da funksional obʻyekt - operator() bilan aniqlangan sinfning nusxasi hisoblanadi. Agar C++ sinfi operator() aniqlasangiz, u funksiya kabi ishladi, ammo holatni saqlay olmaydi. Masalan, 4.11-dasturga qarang.
    4.11-dastur. Operator()ni qayta ishlatish.

    #include "stdafx.h"


    #include #include
    using namespace std;
    class SimpleFunctor { string name_;
    public:
    SimpleFunctor(const char *name) : name_(name) {}
    void operator()() { cout << "Salom, " << name_ << " ishlar zoʻrmi!" << endl; }
    };
    int main() {

    SimpleFunctor sf("Akbar"); sf();


    system("pause"); return 0;
    }





    4.11-dastur. Output


    Salom, Akbar ishlar zoʻrmi!




    Dasturda sf obʻyekt bo‘lishidan qaʻtiy nazar sf() funksiyasini chaqiramiz.
    Chunki SimpleFunctop sinfida operator() aniqlangan.
    Ko‘p hollarda STL kutubxonasining taqqoslash va xatolik funksiyasining algoritmlarida funktorlar C++ da predikatlar sifatida ishlatiladi. Faraz qilaymiz, sonlar ketma ketligi berilgan. Bu ketma ketlikdagi barcha juft sonlar va toq sonlar yig‘indisini hisoblash kerak bo‘lsin. Bu masalani yechish uchun funktor va for_each algoritmidan foydalanish mumkin.
    4.12-dastur. Funktor va for_each algoritmidan foydalanish.

    #include "stdafx.h" #include #include #include using namespace std;


    class EvenOddFunctor { int even_;
    int odd_; public:
    EvenOddFunctor() : even_(0), odd_(0) {} void operator()(int x) {
    if (x%2 == 0) even_ += x; else odd_ += x;
    }
    int even_sum() const { return even_; } int odd_sum() const { return odd_; }
    };
    int main() {

    EvenOddFunctor evenodd;


    int my_list[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    evenodd = for_each(my_list,


    my_list+sizeof(my_list)/sizeof(my_list[0]), evenodd);
    cout << " Juftlar yigʻindisi: " << evenodd.even_sum() << endl; cout << " Toqtlar yigʻindisi: " << evenodd.odd_sum() << endl;
    system("pause"); return 0;
    }





    4.12-dastur. Output


    Juftlar yigʻindisi: 30


    Toqtlar yigʻindisi: 25


    Dasturda for_each da EvenOddFunctor sinf obʻyekti berilgan. for_each my_list bo‘yicha ketma ket o‘tganda funktor funksiyani chaqirmoqda. Har takrorlanishda evenodd funktor nusxasini qaytaradi. Evenodd funktor esa juft yoki toq elmentlarni yig‘indisini saqlaydi.

    Download 0,81 Mb.
    1   ...   36   37   38   39   40   41   42   43   ...   143




    Download 0,81 Mb.

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash

    Download 0,81 Mb.