Skip to content

Iteratorlar (Iterators)

C++ Iteratorlar

Iteratorlar ma'lumot tuzilmalari (vektorlar, toplamlar va boshqalar) elementlariga kirish va ularni aylanib o'tish uchun ishlatiladi, ularga "ko'rsatish" orqali.

U "iterator" deb ataladi, chunki "iteratsiya qilish" — tsikl ning texnik atamasi.

Vektor bo'ylab iteratsiya qilish misoli:

MISOL

cpp
// Satrlarni saqlaydigan cars nomli vektor yaratish
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

// it nomli vektor iteratori yaratish
vector<string>::iterator it;

// Iterator bilan vektor bo'ylab tsikl
for (it = cars.begin(); it != cars.end(); ++it) {
  cout << *it << "\n";
}

Misol tushuntirishi

  1. Avval turli avtomobil ishlab chiqaruvchilarning nomlarini saqlash uchun satrlar vektori yaratamiz.
  2. Keyin vektor bo'ylab aylanish uchun it nomli "vektor iteratori" yaratamiz.
  3. for tsiklida iterator (it) vektordagi birinchi elementga (cars.begin()) ko'rsatadi va it cars.end() ga teng bo'lmaguncha davom etadi.
  4. Oshirish operatori (++it) iteratorni vektordagi keyingi elementga o'tkazadi.
  5. Ochish operatori (*it) iterator ko'rsatayotgan elementga kiradi.

ESLATMA

Iterator turi ma'lumot tuzilmasidagi tur bilan bir xil bo'lishi kerak (misolimizdagi string).


begin() va end() nima?

begin() va end()vektorlar va ro'yxatlar kabi ma'lumot tuzilmalariga tegishli funksiyalar. Ular iteratorning o'ziga tegishli emas. Buning o'rniga, ular iteratorlar bilan birgalikda ma'lumot tuzilmalarining elementlariga kirish va ularni aylanib o'tish uchun ishlatiladi.

  • begin() — ma'lumot tuzilmasining birinchi elementiga ko'rsatuvchi iteratorni qaytaradi
  • end() — oxirgi elementdan keyingi pozitsiyaga ko'rsatuvchi iteratorni qaytaradi

begin() MISOLLARI

cpp
// Birinchi elementga ko'rsatish
it = cars.begin();

// Ikkinchi elementga ko'rsatish
it = cars.begin() + 1;

// Uchinchi elementga ko'rsatish
it = cars.begin() + 2;

end() MISOL

cpp
// Oxirgi elementga ko'rsatish
it = cars.end() - 1;

Iteratorlar ko'rsatkichlar ga o'xshaydi — ular ma'lumot tuzilmasidagi muayyan pozitsiyaga "ko'rsatadi". Masalan, qiymatni o'zgartirish mumkin:

MISOL

cpp
it = cars.begin();
*it = "Tesla";  // Volvo endi Tesla

auto kalit so'zi

C++ 11 dan boshlab, iterator turini aniq belgilash o'rniga auto kalit so'zini ishlatish mumkin:

MISOL

cpp
// Bu o'rniga:
vector<string>::iterator it = cars.begin();

// Shunchaki yozing:
auto it = cars.begin();

for tsiklida ham ishlaydi:

MISOL

cpp
for (auto it = cars.begin(); it != cars.end(); ++it) {
  cout << *it << "\n";
}

For-each tsikli va Iteratorlar

Elementlarni faqat o'qish kerak bo'lsa, for-each tsikli oddiy va toza:

MISOL

cpp
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

for (string car : cars) {
  cout << car << "\n";
}

Biroq, elementlarni iteratsiya paytida qo'shish, o'zgartirish yoki olib tashlash, teskari aylanish yoki elementlarni o'tkazib yuborish kerak bo'lsa, iteratorlar ishlatiladi:

MISOL

cpp
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

for (auto it = cars.begin(); it != cars.end(); ) {
  if (*it == "BMW") {
    it = cars.erase(it);  // BMW elementini olib tashlash
  } else {
    ++it;
  }
}

Teskari iteratsiya

Teskari tartibda aylanish uchun begin() va end() o'rniga rbegin() va rend() ishlatiladi:

MISOL

cpp
for (auto it = cars.rbegin(); it != cars.rend(); ++it) {
  cout << *it << "\n";
}

Boshqa ma'lumot tuzilmalari bo'ylab iteratsiya

Iteratorlar vektorlar, ro'yxatlar, dekyular, toplamlar va lug'atlar uchun bir xil sintaksis bilan ishlaydi:

RO'YXAT MISOLI

cpp
list<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

for (auto it = cars.begin(); it != cars.end(); ++it) {
  cout << *it << "\n";
}

LUG'AT MISOLI

cpp
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };

for (auto it = people.begin(); it != people.end(); ++it) {
  cout << it->first << " is: " << it->second << "\n";
}

ESLATMA

Vektor, ro'yxat, dekyu, lug'at va toplam iteratorlarni qo'llab-quvvatlaydi, steklar va navbatlar esa qo'llab-quvvatlamaydi.


Algoritmlar

Iteratorlarning yana bir muhim xususiyati — ular sort() va find() kabi turli algoritm funksiyalari bilan ishlatiladi:

MISOL

cpp
#include <algorithm>

vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

// Alifbo tartibida saralash
sort(cars.begin(), cars.end());