70 / 90

C++ STL Algorithms

C++ STL algoritmlari

C++ tilida Standart andozalar kutubxonasi (STL) konteyner elementlarini (massivlar, vektorlar va boshqalar) saralash, qidirish va boshqarish kabi operatsiyalarni bajarish uchun ishlatilishi mumkin bo'lgan boy algoritmlar to'plamini taqdim etadi.

Ushbu algoritmlarga <algorithm> sarlavhasi yordamida kirish mumkin.

example.cpp
#include <algorithm>

Ko'p ishlatiladigan algoritmlar

C++ tilidagi <algorithm> kutubxonasi ko‘plab foydali funksiyalarni taklif etadi. Eng ko'p ishlatiladigan funksiyalardan ba'zilari quyida keltirilgan.

Funksiyalar Tavsif sort() Konteyner elementlarini saralash. copy() Berilgan diapazondagi elementlarni nusxalash. move() Berilgan elementlar diapazonini siljiting. swap() Ikki obyektning qiymatlarini almashish. merge() Saralangan diapazonlarni birlashtirish. replace() Element qiymatini almashtiring. remove() Elementni olib tashlang.

[!NOTE] Ushbu funksiyalarning barchasini tushunish uchun vektorlardan foydalanamiz. Biroq, bu funksiyalar boshqa STL konteynerlarida ham ishlaydi.

1-misol: Vektorni o'sish tartibida tartiblang

Vektorni o'sish tartibida saralash uchun biz sort() funksiyasidan foydalanishimiz mumkin. Uning sintaksisi:

example.cpp
sort( first, last);

Bu yerga,

  • birinchi - saralash diapazoni boshlanishini ko'rsatuvchi iterator (shu jumladan)
  • oxirgi - saralash oralig'ining oxirini ko'rsatuvchi iterator (eksklyuziv)
example.cpp
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {

    vector<int> vec = {4, 2, 3, 1, 5};

    // vektor elementlarini tartiblash
    sort(vec.begin(), vec.end());

    for(int num : vec) {
        cout << num << " ";
    }

    return 0;
}

Chiqish

kod
1 2 3 4 5

Bu erda biz sort() diapazonini vec.begin() yordamida vektorimizning boshidan vec.end() yordamida vektor oxirigacha o'rnatdik.

Bu bizning vektorimizni o'sish tartibida tartiblaydi.

2-misol: Vektor elementlarini nusxalash

Biz copy() funksiyasidan elementlarning berilgan diapazonini bir vektordan ikkinchisiga ko'chirish uchun foydalanamiz. Uning sintaksisi:

example.cpp
copy(first, last, result);

Bu yerga,

  • birinchi - nusxa ko'chirish oralig'ining boshlanishini ko'rsatadigan iterator (shu jumladan)
  • oxirgi - nusxa ko'chirish oralig'ining oxirini ko'rsatadigan iterator (eksklyuziv)
  • natija - elementlar nusxalanadigan maqsad vektoridagi pozitsiyani ko'rsatuvchi iterator

Masalan,

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

int main() {

    vector<int> source = {1, 2, 3, 4, 5};

    // 5 o'lchamdagi maqsad vektorini yarating
    vector<int> destination(5);
    
    // manba mazmunini belgilangan joyga nusxalash
    copy(source.begin(), source.end(), destination.begin());

    // maqsad vektorining chop etish elementlari
    for(int num : destination) {
        cout << num << " ";
    }

    return 0;
}

Chiqish

kod
1 2 3 4 5

Bu erda biz besh elementli manba va 5 o'lchamdagi bo'sh vektor manzilini yaratdik.

Keyin manba mazmunini manzilga nusxalash uchun copy() funksiyasidan foydalandik.

3-misol: Vektor elementlarini siljitish

Elementlarni bir vektordan ikkinchisiga ko'chirish uchun move() funksiyasidan foydalanishimiz mumkin. Uning sintaksisi:

example.cpp
move(first, last, result);

Masalan,

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

int main() {

    vector<string> source = {"apple", "banana", "cherry"};
    vector<string> destination(3);

    cout << "Before move:" << endl;
    cout << "source: ";

    for(const string& str : source) {
        cout << str << " ";
    }
    cout << endl;

    cout << "destination: ";
    for(const string& str : destination) {
        cout << str << " ";
    }
    cout << endl;

    // harakatlanish operatsiyasini bajaring
    move(source.begin(), source.end(), destination.begin());

    cout << "After move:" << endl;
    cout << "source: ";
    for(const string& str : source) {
        cout << str << " ";
    }
    cout << endl;

    cout << "destination: ";
    for(const string& str : destination) {
        cout << str << " ";
    }
    cout << endl;

    return 0;
}

Chiqish

kod
Before move:
source: apple banana cherry 
destination:    
After move:
source:    
destination: apple banana cherry

4-misol: Ikki vektorning tarkibini almashtiring

swap() funksiyasidan foydalanib, ikkita STL vektorining mazmunini almashtirishimiz mumkin. Uning sintaksisi:

example.cpp
swap(x, y);

Bu erda x va y - tarkibini almashtirish kerak bo'lgan konteynerlar.

Masalan,

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

int main() {

    vector<int> vec1 = {1, 2, 3};
    vector<int> vec2 = {4, 5, 6};

    // almashtirishdan oldin vec1 va vec2 ni chop eting
    cout << "Before swap:" << endl;
    cout << "vec1: ";
    for(int num : vec1) {
        cout << num << " ";
    }
    cout << endl;

    cout << "vec2: ";
    for(int num : vec2) {
        cout << num << " ";
    }
    cout << endl;

    // vec1 va vec2-ni almashtiring
    swap(vec1, vec2);

    // almashtirishdan keyin vec1 va vec2 ni chop eting
    cout << "After swap:" << endl;
    cout << "vec1: ";
    for(int num : vec1) {
        cout << num << " ";
    }
    cout << endl;

    cout << "vec2: ";
    for(int num : vec2) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

Chiqish

kod
Before swap:
vec1: 1 2 3 
vec2: 4 5 6 
After swap:
vec1: 4 5 6 
vec2: 1 2 3

5-misol: Ikki vektorni birlashtirish

merge() funksiyasidan foydalanib ikkita STL konteynerini birlashtira olamiz. Uning sintaksisi:

example.cpp
merge(first1, last1, first2,  last2, result);

Bu yerga,

  • birinchi1, oxirgi1 - birinchi kirish oralig'ini ko'rsatuvchi iteratorlar.
  • birinchi2, oxirgi2 - ikkinchi kirish diapazonini ko'rsatuvchi iteratorlar.
  • natija - maqsad diapazonining boshlanishini ko'rsatuvchi iterator.

Masalan,

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

int main() {

    vector<int> vec1 = {1, 3, 5};
    vector<int> vec2 = {2, 4, 6};
    vector<int> result(6);

    // vec1 va vec2 birlashmasidan oldin
    cout << "Before merge:" << endl;
    cout << "vec1: ";
    for(int num : vec1) {
        cout << num << " ";
    }
    cout << endl;

    cout << "vec2: ";
    for(int num : vec2) {
        cout << num << " ";
    }
    cout << endl;

    // birlashtirish operatsiyasini bajarish
    merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());

    // birlashgandan keyin chiqish natijasi
    cout << "After merge:" << endl;
    cout << "result: ";
    for(int num : result) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

Chiqish

kod
Before merge:
vec1: 1 3 5 
vec2: 2 4 6 
After merge:
result: 1 2 3 4 5 6

E'tibor bering, birlashtirilgan vektor tartiblangan tartibda qaytariladi.

6-misol: Vektor elementini almashtiring

replace() funksiyasidan foydalanib, biz STL konteyneridagi barcha elementni boshqa element bilan almashtira olamiz. Uning sintaksisi:

example.cpp
replace(first, last, old_value, new_value);

Bu yerga,

  • birinchi, oxirgi - o'zgartirish oralig'ini ko'rsatuvchi iteratorlar.
  • old_value - almashtiriladigan qiymat.
  • new_value - almashtirish qiymati.

Masalan,

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

int main() {

    vector<int> vec = {4, 2, 3, 2, 5};

    // almashtirishdan oldin vektorni ko'rsatish
    cout << "Before: ";
    for(int num : vec) {
        cout << num << " ";
    }
    cout << endl;

    // 2 ni 99 bilan almashtiring
    replace(vec.begin(), vec.end(), 2, 99);

    // almashtirilgandan keyin vektorni ko'rsatish
    cout << "After: ";
    for(int num : vec) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

Chiqish

kod
Before: 4 2 3 2 5 
After: 4 99 3 99 5

Bu erda biz 2 ning barcha holatlarini 99 bilan almashtirdik.

7-misol: Berilgan diapazondan qiymatni o'chirish

remove() funksiyasidan foydalanib, berilgan diapazondan qiymatning birinchi takrorlanishini olib tashlashimiz mumkin. Uning sintaksisi:

example.cpp
remove(first, last, val);

Bu yerga,

  • birinchi, oxirgi - o'zgartirish oralig'ini ko'rsatuvchi iteratorlar
  • val - olib tashlanadigan qiymat

Masalan,

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

int main() {

    vector<int> vec = {4, 2, 3, 2, 5};

    // o'chirishdan oldin vektorni chop eting
    cout << "Before deletion: ";
    for(int num : vec) {
        cout << num << " ";
    }
    cout << endl;

    // 2 ning birinchi takrorlanishini olib tashlang
    remove(vec.begin(), vec.end(), 2);

    // o'chirishdan keyin vektorni chop eting
    cout << "After deletion: ";
    for(int num : vec) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

Chiqish

kod
Before deletion: 4 2 3 2 5 
After deletion: 4 3 5 2 5