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 ro'yxat yaratish uchun kodimizga <forward_list> sarlavhasini kiritishimiz kerak.
#include <forward_list>
Biz oldingi ro'yxatni ishga tushirishimiz mumkin
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,
// 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"};
#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
1 3 2 4 5
E'tibor bering, elementlar kiritilgan tartibda paydo bo'ladi.
[!NOTE] Qo'llanma davomida biz
stdnom maydonidan foydalanamiz. Shunday qilib, biz misollarimizdanstd::ni chiqarib tashladik.
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.
Biz front() funksiyasidan foydalanib, yo'naltirish ro'yxatining birinchi elementiga kira olamiz. Masalan,
#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
The first element is: 1
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,
#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
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:
// uni ikkinchi holatga qarating
auto itr = fwd_list.begin();
advance(itr, 1);
Keyin elementni itr ko'rsatgan joydan keyin keladigan joyga joylashtiramiz:
// undan keyin 7 ta joyni qo'ying
fwd_list.insert_after(itr, 7);
Biz assign() funksiyasidan foydalanib, oldinga siljish ro'yxatining butun tarkibini yangi elementlar bilan yangilashimiz mumkin. Masalan,
#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
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.
Oldinga ro'yxatdagi elementlarni o'chirishning uchta usuli mavjud:
Masalan,
#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
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():