C++ STL konteynerlari
Konteyner - bu ma'lum turdagi ob'ektlar to'plamini saqlaydigan ob'ekt. Misol uchun, agar biz nomlar ro'yxatini saqlashimiz kerak bo'lsa, biz vector dan foydalanishimiz mumkin.
C++ STL bizning talablarimiz asosida har xil turdagi konteynerlarni taqdim etadi.
C++ tilida odatda 3 xil STL konteynerlari mavjud:
C++ da ketma-ket konteynerlar ketma-ket tartibda kirish mumkin bo'lgan elementlarni saqlashga imkon beradi.
Ichkarida, ketma-ket konteynerlar massivlar yoki bog'langan ro'yxatlar ma'lumotlar tuzilmalari sifatida amalga oshiriladi.
Ketma-ket konteynerlarning turlari
Ushbu misolda biz ketma-ket konteynerning ishlashini ko'rsatish uchun vector sinfidan foydalanamiz.
#include <iostream>
#include <vector>
using namespace std;
int main() {
// int tipidagi vektorni ishga tushiring
vector<int> numbers = {1, 100, 10, 70, 100};
// vektorni chop eting
cout << "Numbers are: ";
for(auto &num: numbers) {
cout << num << ", ";
}
return 0;
}
Chiqish
Numbers are: 1, 100, 10, 70, 100,
Yuqoridagi misolda biz vector sinfidan foydalanib ketma-ket konteyner raqamlarini yaratdik.
vector<int> numbers = {1, 100, 10, 70, 100};
Bu erda biz konteynerning har bir elementini chop etish uchun ranged for loop dan foydalandik.
Chiqishda biz raqamlar boshlanganda ketma-ket ko'rsatilganligini ko'rishimiz mumkin.
// chiqish raqamlari
1, 100, 10, 70, 100,
C++ da assotsiativ konteynerlar elementlarni tartiblangan tartibda saqlashga imkon beradi. Buyurtma element qachon kiritilganiga bog'liq emas.
Ichkarida ular ikkilik daraxt ma'lumotlar tuzilmalari sifatida amalga oshiriladi.
Assotsiativ konteynerlarning turlari
Ushbu misolda biz assotsiativ konteynerning ishlashini ko'rsatish uchun set sinfidan foydalanamiz.
#include <iostream>
#include <set>
using namespace std;
int main() {
// int tipidagi to'plamni ishga tushiring
set<int> numbers = {1, 100, 10, 70, 100};
// to'plamni chop eting
cout << "Numbers are: ";
for(auto &num: numbers) {
cout << num << ", ";
}
return 0;
}
Chiqish
Numbers are: 1, 10, 70, 100,
Yuqoridagi misolda biz set sinfidan foydalangan holda assotsiativ konteyner yaratdik.
Biz tartibsiz tamsayılar bilan nomli raqamlar to'plamini va takroriy qiymat 100 bilan ishga tushirdik:
set<int> numbers = {1, 100, 10, 70, 100};
Keyin biz for diapazoni yordamida to'plam tarkibini chop etamiz.
Chiqishda raqamlar o'sish tartibida takrorlangan raqamlar olib tashlanganligini ko'ramiz. Dastlab, 100 ikki marta takrorlangan, ammo to'plam 100 raqamini olib tashlaydi.
// chiqish raqamlari
1, 10, 70, 100
C++ da STL tartibsiz assotsiativ konteynerlar assotsiativ konteynerning tartiblanmagan versiyalarini taqdim etadi.
Ichki tartibsiz assotsiativ konteynerlar xesh-jadval ma'lumotlar tuzilmalari sifatida amalga oshiriladi.
Tartibsiz assotsiativ konteynerlarning turlari
Ushbu misolda biz tartibsiz assotsiativ konteynerning ishlashini ko'rsatish uchun unordered_set sinfidan foydalanamiz.
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
// int tipidagi tartibsiz_to'plamni ishga tushiring
unordered_set<int> numbers = {1, 100, 10, 70, 100};
// to'plamni chop eting
cout << "Numbers are: ";
for(auto &num: numbers) {
cout << num << ", ";
}
return 0;
}
Chiqish
Numbers are: 70, 10, 100, 1,
Yuqoridagi misolda biz unordered_set sinfidan foydalangan holda assotsiativ konteyner yaratdik.
Biz tartiblanmagan to'plam raqamlarini tartibsiz butun sonlar bilan birga takroriy qiymat 100 bilan ishga tushirdik:
unordered_set<int> numbers = {1, 100, 10, 70, 100};
Keyin diapazonga asoslangan for sikli yordamida to'plamning mazmunini chop etamiz.
Chiqishda biz 100-raqamli dublikat o'chirilganligini ko'ramiz, lekin u o'sish tartibida tartiblanmagan.
// chiqish raqamlari
70, 10, 100, 1,
C++ da konteyner adapterlari mavjud STL konteynerini oladi va ularni boshqacha tutishi uchun cheklangan interfeysni taqdim etadi. Masalan,
Stack - bu deque ketma-ket konteyneridan foydalanadigan va faqat push() va pop() operatsiyalarini qo'llab-quvvatlash uchun cheklangan interfeysni ta'minlovchi konteyner adapteri.
Konteyner adapterlarining turlari
Ushbu misolda biz konteyner adapterining ishlashini ko'rsatish uchun stack sinfidan foydalanamiz.
#include <iostream>
#include <stack>
using namespace std;
int main() {
// ints to'plamini yarating
stack<int> numbers;
// stack ichiga suring
numbers.push(1);
numbers.push(100);
numbers.push(10);
cout << "Numbers are: ";
// biz elementga yuqori qismini olish va ochish orqali kira olamiz
// to'plam bo'sh bo'lguncha
while(!numbers.empty()) {
// yuqori elementni chop etish
cout << numbers.top() << ", ";
// stekdan yuqori elementni oching
numbers.pop();
}
return 0;
}
Chiqish
Numbers are: 10, 100, 1,
Yuqoridagi misolda biz stack sinfidan foydalanib konteyner adapterini yaratdik.
stack <int> numbers;
Boshqa konteynerlardan farqli o'laroq, biz ushbu konteynerga qiymatlarni to'g'ridan-to'g'ri ishga tushirmayapmiz. Buning sababi, konteyner adapteri qiymatlarni to'g'ridan-to'g'ri konteynerga belgilashni cheklaydi.
Shuning uchun biz stekga elementlarni kiritish uchun push() operatsiyasidan foydalandik.
Xuddi shunday, biz ushbu konteyner orqali to'g'ridan-to'g'ri takrorlashimiz mumkin emas. Shunday qilib, biz stek bo'sh bo'lgunga qadar takrorlanadigan sikldan foydalandik.
while (!numbers.empty()) {
cout << numbers.top() << ", ";
numbers.pop();
}
Bu yerga,
-numbers.empty() - stack bo'sh yoki yo'qligini tekshiradi
-numbers.top() - stack ning yuqori qismidagi elementni qaytaradi
-numbers.pop() - stack ning yuqori elementini olib tashlaydi