3.1. To’g’ri va teskari iteratorlar
STL kutubxonasi oddiy (to’g’ri) iterator – iteratorlaridan tashqari reverse_iterator – teskari iteratorlarni ham qo’llaydi. Teskari iteratorlar ham to’g’ri iteratorlar kabi ishlatiladi. Farqi keyingi va oldingi elementlarga o’tish operatorlarini ishlatishda hisoblanadi. To’g’ri iteratorlar uchun ++ konteynerning keyingi elementiga kirishni ta’minlasa, teskari iteratorlar uchun – oldingi elementga kirishni ta’minlab beradi.
4. Ketma-ket konteynerlarning qo’llanilishi
Asosiy konteynerlarga vektorlar (vector), ro’yxatlar (list) va ikki tomonlama navbatlar (deque) kiradi. Konteynerlardan foydalanish uchun mos sarlavha fayllarini biriktirish kerak bo’ladi:
#include
#include
#include
Vektor oddiy massivga o’xshash, faqat kerakli xotirani avtomatik ajratish va xotirani tozalash bilan farq qiladi. Konteyner [] operatori yoki at funksiyasi yordamida elementlarni erkin tanlab olishdan samarali foydalanadi. Biroq vektorning oxiridan tashqari ixtiyoriy o’rniga elementni joylashtirish samarali emas. Buning uchun tanlab olingan o’rindan keyingi barcha elementlarni ularning qiymatlarini nusxalash orqali siljitish talab etiladi. Shu sababli oxirgi elementdan ixtiyoriy boshqasini o’chirish ham samarasiz hisoblanadi.
Ro’yxat ob’ektlarni ikki bog’lamli ro’yxat ko’rinishida saqlash imkonini beradi. Ro’yxatning ixtiyoriy o’rnidan yangi elementni qo’shish yoki tanlangan elementni o’chirish samarali hisoblanadi. Biroq ro’yxat elementlariga erkin kirish imkonini bermaydi, masalan, n-elementni tanlash uchun ketma-ket undan oldin turgan n-1 ta elementni ko’rib chiqish kerak bo’ladi.
Ikki tomonlama navbat ko’proq vektorga o’xshash bo’lib, elementlari xotiraning uzluksiz sohasida saqlanadi. Biroq vektordan farqli tomoni ikki tomonlama navbatlarda birinchi elementni o’chirish va yangi elementni birinchi o’ringa qo’shish juda ham samarali (shuningdek, oxiridan ham).
3-dastur kodi: Ketma-ket konteynerlar uchun ob’ektni aniqlash usullari.
Bo’sh konteyner yaratish:
vector vec1;
list lst1;
Konteynerga tanlangan o’lchamni berish va elementlarini jimlik holatiga qiymatlar bilan ta’minlash:
vector vec2(50);
list lst2(75);
Konteynerga tanlangan o’lchamni berish va elementlariga berilgan qiymatlarni ta’minlash:
vector vec3(133, 7);
list lst3(14, 8.8);
Koteynerni aniqlash va uning elementlariga boshqa konteynerning (first, last) oralig’idagi qiymatlarni ta’minlash:
int arr[8] = {0, 20, 1, 22, 8 -144, 6, -50, 100, 45};
vector vec4(arr, arr+9);
list lst4(vec4.begin()+2, vec4.end());
Koteynerni aniqlash va uning elementlariga boshqa bir turdagi konteynerning elementlari qiymatini ta’minlash:
list lst5(10, 6);
list lst6(lst5);
3-jadval. Ketma-ket konteynerlardan qo’llaniladigan funksiyalar
push_back(T& key)
|
Oxiridan qo’shish
|
vector, list, deque
|
pop_back()
|
Oxiridan o’chirish
|
vector, list, deque
|
push_front(T& key)
|
Boshidan qo’shish
|
list, deque
|
pop_front()
|
Boshidan o’chirish
|
list, deque
|
insert
|
Ixtiyoriy joydan qo’shish
|
vector, list, deque
|
erase
|
Ixtiyoriy joydan o’chirish
|
vector, list, deque
|
[], at
|
Ixtiyoriy elementga kirish
|
vector, deque
|
swap
|
Ro’yxatlar/vektorlarni almashtirish
|
vector, list
|
clear()
|
Ro’yxatlar/vektorlarni tozalash
|
vector, list
|
splice
|
Ikkita ro’yxatni birlashtirish
|
list
|
insert funksiyasining bir necha xil tatbiqlari mavjud:
iterator insert(iterator pos, const T& key); – key elementini pos ko’rsatkichi ko’rsatib turgan joyga qo’shish. Iterator yangi elementni qaytaradi.
void insert(iterator pos, size_type n, const T& key); – key qiymatli n ta elementni pos ko’rsatkichi ko’rsatib turgan joydan boshlab qo’shish.
template
void insert(iterator pos, InputIter first, InputIter last); – first..last oraliqdagi elementlarni pos ko’rsatkichi ko’rsatib turgan joydan boshlab qo’shish.
4-dastur kodi: insert() funksiyasining qo’llanilishi:
void main() {
//5 ta 0 qiymatli elementlardan iborat vektorni yaratish:
vector v1(5,0);
//5 ta elementli massiv:
int m[5]={1,2,3,4,5};
// qiymati 100 bo’lgan elementni vektor boshiga joylashtirish:
v1.insert(v1.begin(),100);
//ikkita qiymati 200 ga teng bo’lgan elementni vektorning birinchi elementidan keyin joylashtirish:
v1.insert(v1.begin()+1,2,200);
//vektorning 3-elementidan keyin massivning m elementini joylashtirish:
v1.insert(v1.begin()+3,m,m+5); //m – birinchi elementga ko’rsatkich, +5 beshta element
//vektor oxiriga 100 qiymatli elementni joylashtirish:
v1.insert(v1.end(),100);
//vektorni chop qilish:
for(int i=0;i
cout << v1[i] <<' ';
}
erase funksiyasi ham bir nechta tatbiqlarga ega:
iterator erase(iterator pos); – pos iteratori ko’rsatib turgan o’rindagi elementni o’chirish.
iterator erase(iterator first, iterator last); – ko’rsatilgan oraliqdagi elementlarni o’chirish.
5-dastur kodi: erase() funksiyasining qo’llanilishiga misol:
int main() {
vector v1; //bo’sh vektor yaratish
int m[5] = {1,2,3,4,5};
int n,a;
cout << "insert n: "; cin >> n;
for(int i=0; i < n; i++) {
cin >> a;
//vektorning oxiridan a qiymatli elementni qo’shish:
v1.push_back(a);
}
//vektorni chop qilish
for (int i=0; i < v1.size(); i++)
cout << v1[i] << ' ';
cout << endl;
/*vektorning boshidan elementni o’chirish va iteratorni vektor boshiga qo’yish */
vector::iterator iv=v1.erase(v1.begin());
cout << *iv << '\n'; //birinchi elementni chiqarish
//vektorni chop qilish
for (int i=0; i < v1.size(); i++)
cout << v1[i] << ' ';
}
Do'stlaringiz bilan baham: |