53 / 90

C++ STL Containers

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++ da STL konteynerining turlari

C++ tilida odatda 3 xil STL konteynerlari mavjud:

  • Ketma-ket konteynerlar
  • Assotsiativ konteynerlar
  • Tartibsiz assotsiativ konteynerlar

1. C++ tilida ketma-ket konteynerlar

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

  • Massiv
  • Vektor
  • Deque
  • Roʻyxat
  • Oldinga ro'yxat

Misol: C++ Sequential Container (vektor)

Ushbu misolda biz ketma-ket konteynerning ishlashini ko'rsatish uchun vector sinfidan foydalanamiz.

example.cpp
#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

kod
Numbers are: 1, 100, 10, 70, 100,

Yuqoridagi misolda biz vector sinfidan foydalanib ketma-ket konteyner raqamlarini yaratdik.

example.cpp
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.

example.cpp
// chiqish raqamlari
1, 100, 10, 70, 100,

2. C++ da assotsiativ konteynerlar

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

  • Oʻrnatish
  • Xarita
  • Multiset
  • Multimap

Misol: C++ assotsiativ konteyneri (to'plam)

Ushbu misolda biz assotsiativ konteynerning ishlashini ko'rsatish uchun set sinfidan foydalanamiz.

example.cpp
#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

kod
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:

example.cpp
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.

example.cpp
// chiqish raqamlari
1, 10, 70, 100

3. C++ da tartiblanmagan assotsiativ konteynerlar

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

  • Tartibsiz to'plam
  • Tartibsiz xarita
  • Tartibsiz multiset
  • Tartibsiz multimap

Misol: C++ tartibsiz assotsiativ konteyner (tartibsiz_to'plam)

Ushbu misolda biz tartibsiz assotsiativ konteynerning ishlashini ko'rsatish uchun unordered_set sinfidan foydalanamiz.

example.cpp
#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

kod
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:

example.cpp
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.

example.cpp
// chiqish raqamlari
70, 10, 100, 1,

C++ da konteyner adapterlari

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

  • Stak
  • Navbat
  • Ustuvor navbat

Misol: C++ konteyner adapteri (stek)

Ushbu misolda biz konteyner adapterining ishlashini ko'rsatish uchun stack sinfidan foydalanamiz.

example.cpp
#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

kod
Numbers are: 10, 100, 1,

Yuqoridagi misolda biz stack sinfidan foydalanib konteyner adapterini yaratdik.

example.cpp
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.

example.cpp
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