52 / 90

C++ Standard Template Library (STL)

C++ Standart shablon kutubxonasi (STL)

C++ da standart andozalar kutubxonasi (STL) vektorlar, roʻyxatlar, navbatlar va boshqalar kabi algoritmlar va maʼlumotlar tuzilmalarini amalga oshirish uchun dasturlash vositalari toʻplamini taqdim etadi.

STL ushbu ma'lumotlar tuzilmalari va algoritmlarini sinchkovlik bilan sinovdan o'tgan umumiy maqsadli sinflar va funksiyalardan foydalangan holda amalga oshiradi.

C++ STL 3 ta asosiy komponentga ega:

  • Konteynerlar
  • Iteratorlar
  • Algoritmlar

Bularga qo'shimcha ravishda STL yana bir qancha funksiyalarni, jumladan, funksiya ob'ektlarini, aqlli ko'rsatgichlarni va istisnolarni boshqarish mexanizmlarini taqdim etadi.

C++ STL konteynerlari

STL konteynerlari ma'lumotlarni saqlaydi va kerak bo'lganda ularni muayyan tarzda tartibga soladi.

Masalan, vektorlar bir xil turdagi ma'lumotlarni ketma-ketlikda saqlaydi. Holbuki, xaritalar ma'lumotlarni kalit-qiymat juftliklarida saqlaydi.

STL konteynerlarini 3 turga ajratishimiz mumkin:

  1. Konteynerlar ketma-ketligi:
  1. Assotsiativ konteynerlar:
  • Oʻrnatish
  • Multiset
  • Xarita
  • Multimap
  1. Tartibsiz assotsiativ konteynerlar:

Konteynerlar haqida ko'proq ma'lumot olish uchun C++ STL Containers qo'llanmamizga tashrif buyuring.

[!NOTE] STL massivi biz hozirgacha ishlatib kelgan umumiy massivlardan farq qiladi. STL massivi std::array sinfida aniqlanadi, u massiv ma'lumotlar strukturasiga qo'shimcha ravishda ko'plab foydali funksiyalar va algoritmlarni o'z ichiga oladi. Bu xususiyatlar oddiy massivlarda mavjud emas.

1-misol: C++ STL konteynerlari: Vektor

C++ da vektorlar o'lchami o'zgartiriladigan massivlarga o'xshaydi; ular bir xil turdagi ma'lumotlarni ketma-ketlikda saqlaydi va kerak bo'lganda ularning hajmini ish vaqtida o'zgartirish mumkin.

Vektordan foydalanish uchun <vector> sarlavha faylini import qilishimiz kerak.

example.cpp
#include <iostream>
#include <vector>

using namespace std;

int main() {
    
    // int tipidagi vektor yaratish
    vector<int> numbers {1, 2, 3, 4, 5};

    // diapazonli sikl yordamida vektor elementlarini chop etish
    for (int number : numbers) {
        cout << number << "  ";
    }
    
    return 0;
}

Chiqish

kod
1  2  3  4  5

Bu erda biz int tipidagi 5 ta elementdan iborat raqamlar nomli vektorni yaratdik.

Keyin vektorning barcha elementlarini chop etish uchun ranged for loop dan foydalandik.

C++ da vektorlar haqida koʻproq maʼlumot olish uchun C++ Vectors qoʻllanmamizga tashrif buyuring.

C++ STL iteratorlari

Iteratorlar - bu konteyner elementlariga kirish uchun ishlatiladigan ob'ektlar.

Biz C++ standart andozalar kutubxonasida har bir konteyner uchun iteratorni e'lon qilishimiz mumkin. Masalan,

example.cpp
vector<int>::iterator it;

Biz konteyner elementlariga ishora qiluvchi iteratorlarni qaytarish uchun begin() , end() va hokazo kabi iterator aʼzo funksiyalaridan tez-tez foydalanamiz. Masalan,

example.cpp
vector<int> numbers = {3, 2, 5, 1, 4};
vector<int>::iterator itr1 = numbers.begin();
vector<int>::iterator itr2 = numbers.end();

Bu yerga,

-numbers.begin() - raqamlar vektorining, ya'ni 3-elementning boshiga ishora qiluvchi iteratorni qaytaradi -numbers.end() - raqamlar vektorining oxiriga ishora qiluvchi iteratorni qaytaradi.

[!NOTE] numbers.end() yakuniy vektor elementiga iteratorni qaytarmaydi 4. Buning o'rniga u yakuniy elementdan keyin keladigan nazariy elementga iteratorni qaytaradi. Xuddi shu narsa boshqa barcha konteyner turlariga ham tegishli.

STL-dagi iteratorlar haqida ko'proq ma'lumot olish uchun C++ STL iteratorlari bo'yicha o'quv qo'llanmamizga tashrif buyuring.

2-misol: C++ STL iteratorlari

example.cpp
#include <iostream>
#include <vector>
using namespace std;

int main() {
    
    // int tipidagi vektorni ishga tushirish
    vector<int> numbers {1, 2, 3, 4, 5};

    // birinchi elementga ishora qilish uchun vektor iteratorini ishga tushiring
    vector<int>::iterator itr = numbers.begin();
    cout << "First Element: " << *itr << "  "<<endl;

    // oxirgi elementga ishora qilish uchun iteratorni o'zgartiring
    itr = numbers.end() - 1;
    cout << "Last Element: " << *itr;

    return 0;  
}

Chiqish

kod
First Element: 1  
Last Element: 5

Bu erda biz numbers.end() o'rniga numbers.end()- 1 dan foydalandik.

Buning sababi, end() funksiyasi konteynerning oxirgi elementidan keyin keladigan nazariy elementga ishora qiladi.

Yakuniy elementga ishora qilish uchun numbers.end() dan 1 ni ayirishimiz kerak. Xuddi shunday, numbers.end()- 2 kodidan foydalanish ikkinchi-oxirgi elementga ishora qiladi va hokazo.

[!NOTE] Itr oldidagi yulduzcha * iterator ko'rsatgan element qiymatiga kirishni bildiradi. Bu dereferencing pointers ga o'xshaydi. Bundan tashqari, biz iteratorlarni chop etishga harakat qilganimizda, biz xatoga duch kelamiz. // xato kout << itr << " "; Buning sababi, ko'rsatkichlardan farqli o'laroq, biz iteratorni chop eta olmaymiz.

C++ STL algoritmlari

Algoritm - bu ma'lum bir masalani hal qilish uchun bir qator ko'rsatmalar.

C++ tilida biz ba'zi tez-tez ishlatiladigan algoritmlarni amalga oshirish uchun standart andozalar kutubxonasidan foydalanishimiz mumkin. Ushbu STL komponentlari oddiygina "algoritmlar kutubxonasi" sifatida tanilgan.

C++ standart andozalar kutubxonasida eng ko'p ishlatiladigan algoritmlardan ba'zilari:

  • Saralash algoritmlari
  • Qidiruv algoritmlari
  • Nusxa olish algoritmlari
  • Hisoblash algoritmlari

Algoritmlar kutubxonasi haqida koʻproq maʼlumot olish uchun C++ STL algoritmlari boʻyicha oʻquv qoʻllanmamizga tashrif buyuring.

3-misol: C++ STL saralash algoritmi

example.cpp
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
    
    // int tipidagi vektorni ishga tushirish
    vector<int> numbers = {3, 2, 5, 1, 4};

    // vektor elementlarini o'sish tartibida tartiblang
    sort(numbers.begin(), numbers.end());

    // tartiblangan vektorni chop eting
    for (int number : numbers) {
        cout << number << "  ";
    }
    
    return 0;    
}

Chiqish

kod
1  2  3  4  5

Ushbu misolda biz sort() funksiyasidan numbers vektorining elementlarini ortib boruvchi tartibda tartiblash uchun foydalandik.

sort() funksiyasidan foydalanish uchun <algorithm> sarlavha faylini import qilganimizga e'tibor bering.