57 / 90

C++ std::forward_list

C++ std::forward_list (Bir tomonlama ro'yxat)

C++ to'g'ridan-to'g'ri ro'yxatlar qat'iy chiziqli ketma-ketlikda tartiblangan ketma-ketlik konteynerlari bo'lib, unda doimiy vaqt samaradorligi bilan ketma-ketlikning istalgan joyiga elementlarni qo'shishingiz yoki olib tashlashingiz mumkin.

Oldinga ro'yxatdagi elementlar keyingi elementning joylashuvi haqidagi ma'lumotlarni saqlaydi. Shunday qilib, ular massiv, vektorlar va boshqalar kabi konteynerlarga qaraganda elementlarni kiritish, ko'chirish va chiqarishda samaraliroqdir.

Biroq, oldingi ro'yxatlarda to'g'ridan-to'g'ri tasodifiy kirish qo'llab-quvvatlanmaydi.

Oldinga yo'naltirilgan ro'yxatni yarating

Oldinga ro'yxat yaratish uchun kodimizga <forward_list> sarlavhasini kiritishimiz kerak.

example.cpp
#include <forward_list>

Biz oldingi ro'yxatni ishga tushirishimiz mumkin

example.cpp
std::forward_list<data_type> forward_list_name = {value1, value2, value3, ...};

Bu yerga,

-data_type - yo'naltiruvchi ro'yxatdagi ma'lumotlar turi. -forward_list_name - yo'naltiruvchi ro'yxat nomi.

  • value1, value2, value3, ... - values to be inserted.

Masalan,

example.cpp
// butun sonlarni yo'naltirish ro'yxatini yarating
std::forward_list<int> integer_fwd_list = {1, 3, 2, 4, 5};

// oldinga siljish ro'yxatini yarating
std::forward_list<string> string_fwd_list = {"Eeny", "Meeny", "Miny", "Moe"};

1-misol: C++ Forward List

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

int main() {

    forward_list<int> fwd_list = {1, 3, 2, 4, 5};

    // oldingi ro'yxatdagi elementlarni chop eting
    for (const int& element : fwd_list) {
        cout << element << " ";
    }

    return 0;
}

Chiqish

kod
1 3 2 4 5

E'tibor bering, elementlar kiritilgan tartibda paydo bo'ladi.

[!NOTE] Qo'llanma davomida biz std nom maydonidan foydalanamiz. Shunday qilib, biz misollarimizdan std:: ni chiqarib tashladik.

Ro'yxatlarni yo'naltirish usullari

Oldinga ro'yxatlar bilan ishlatiladigan eng keng tarqalgan usullardan ba'zilari quyida keltirilgan:

Funksiyalar Tavsif front() Old elementga kirish. push_front() Roʻyxat boshiga element qoʻshing. insert_after() Berilgan pozitsiyadan so'ng darhol pozitsiyaga element qo'shing. assign() Joriy tarkibni almashtirish orqali roʻyxatga yangi tarkiblarni tayinlang. pop_front() Old tomondan elementni olib tashlang. remove() Muayyan qiymatlarga ega elementlarni olib tashlang. clear() Roʻyxatning barcha mazmunini oʻchirib tashlang.

2-misol: Oldinga ro'yxatning birinchi elementini toping

Biz front() funksiyasidan foydalanib, yo'naltirish ro'yxatining birinchi elementiga kira olamiz. Masalan,

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

using namespace std;

int main() {

    forward_list<int> fwd_list = {1, 2, 3, 4, 5};

    // birinchi elementga kirish
    int first_element = fwd_list.front();

    cout << "The first element is: " << first_element;

    return 0;
}

Chiqish

kod
The first element is: 1

3-misol: Yo'naltirilgan ro'yxatga elementlar qo'shing

Oldinga ro'yxatga elementlar qo'shishning ikki yo'li mavjud:

-push_front() - elementni ro'yxatning old qismiga qo'shadi. -insert_after() - belgilangan pozitsiyaga element qo'shadi.

Masalan,

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

using namespace std;

int main() {

    forward_list<int> fwd_list = {1, 2, 5};

    // old qismga element qo'shing
    fwd_list.push_front(2);

    cout << "Forward List after push_front(): ";
    for (const int& element : fwd_list) {
        cout << element << " ";
    }
    cout << endl;

    // iteratorni oldingi ro'yxatning 2-pog'onasiga yo'naltiring
    auto itr = fwd_list.begin();
    advance(itr, 1);

    // 7-elementni 3-o'ringa qo'ying
    fwd_list.insert_after(itr, 7);

    cout << "Forward List after insert_after(): ";
    for (const int& element : fwd_list) {
        cout << element << " ";
    }
    cout << endl;

    return 0;
}

Chiqish

kod
Forward List after push_front(): 2 1 2 5 
Forward List after insert_after(): 2 1 7 2 5

Bu erda fwd_list.push_front(); fwd_list oldiga 2 qo'shadi.

Biroq, uchinchi o'ringa 7 qo'shish uchun avval itr iteratorini oldingi ro'yxatning ikkinchi pozitsiyasiga keltirishimiz kerak:

example.cpp
// uni ikkinchi holatga qarating
auto itr = fwd_list.begin();
advance(itr, 1);

Keyin elementni itr ko'rsatgan joydan keyin keladigan joyga joylashtiramiz:

example.cpp
// undan keyin 7 ta joyni qo'ying
fwd_list.insert_after(itr, 7);

4-misol: Yo'naltiruvchi ro'yxat tarkibini yangilang

Biz assign() funksiyasidan foydalanib, oldinga siljish ro'yxatining butun tarkibini yangi elementlar bilan yangilashimiz mumkin. Masalan,

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

using namespace std;

int main() {

    forward_list<int> fwd_list = {1, 2, 5};
    
    cout << "Forward List before assign(): ";
    for (const int& element : fwd_list) {
        cout << element << " ";
    }
    
    // oldinga siljish ro'yxatining butun mazmunini almashtiring
    // yangi elementlar bilan 3 va 4
    fwd_list.assign({3, 4});

    cout << "\nForward List after assign(): ";
    for (const int& element : fwd_list) {
        cout << element << " ";
    }
    cout << endl;
    
    return 0;    
}

Chiqish

kod
Forward List before assign(): 1 2 5 
Forward List after assign(): 3 4

Ko'rib turganingizdek, assign() funksiyasi oldingi ro'yxatning asl tarkibini yangilari bilan almashtiradi.

5-misol: Oldinga yo'naltirilgan ro'yxatdagi elementlarni o'chirish

Oldinga ro'yxatdagi elementlarni o'chirishning uchta usuli mavjud:

  • pop_front() - ro'yxatning birinchi elementini o'chiradi.
  • remove() - ko'rsatilgan elementning barcha holatlarini ro'yxatdan o'chiradi.
  • clear() - ro'yxatdagi barcha elementlarni o'chiradi.

Masalan,

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

using namespace std;

int main() {

    forward_list<int> fwd_list = {1, 2, 3, 4, 3, 5};

    cout << "Original Forward List: ";
    for (const int& element : fwd_list) {
        cout << element << " ";
    }
    cout << endl;

    // birinchi elementni olib tashlang
    fwd_list.pop_front();

    cout << "Forward List after pop_front(): ";
    for (const int& element : fwd_list) {
        cout << element << " ";
    }
    cout << endl;

    // 3 ning barcha holatlarini olib tashlang
    fwd_list.remove(3);

    cout << "Forward List after remove(3): ";
    for (const int& element : fwd_list) {
        cout << element << " ";
    }
    cout << endl;

    // ro'yxatning barcha elementlarini olib tashlang
    fwd_list.clear();

    cout << "Forward List after clear(): ";
    for (const int& element : fwd_list) {
        cout << element << " ";
    }
    cout << endl;

    return 0;
}

Chiqish

kod
Original Forward List: 1 2 3 4 3 5 
Forward List after pop_front(): 2 3 4 3 5 
Forward List after remove(3): 2 4 5 
Forward List after clear():