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
// 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
- Avval turli avtomobil ishlab chiqaruvchilarning nomlarini saqlash uchun satrlar vektori yaratamiz.
- Keyin vektor bo'ylab aylanish uchun
itnomli "vektor iteratori" yaratamiz. fortsiklida iterator (it) vektordagi birinchi elementga (cars.begin()) ko'rsatadi vaitcars.end()ga teng bo'lmaguncha davom etadi.- Oshirish operatori (
++it) iteratorni vektordagi keyingi elementga o'tkazadi. - 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 qaytaradiend()— oxirgi elementdan keyingi pozitsiyaga ko'rsatuvchi iteratorni qaytaradi
begin() MISOLLARI
// 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
// 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
it = cars.begin();
*it = "Tesla"; // Volvo endi Teslaauto kalit so'zi
C++ 11 dan boshlab, iterator turini aniq belgilash o'rniga auto kalit so'zini ishlatish mumkin:
MISOL
// Bu o'rniga:
vector<string>::iterator it = cars.begin();
// Shunchaki yozing:
auto it = cars.begin();for tsiklida ham ishlaydi:
MISOL
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
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
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
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
list<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (auto it = cars.begin(); it != cars.end(); ++it) {
cout << *it << "\n";
}LUG'AT MISOLI
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
#include <algorithm>
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// Alifbo tartibida saralash
sort(cars.begin(), cars.end());