Добавил:
bekan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:2-semestr / 3-lekciya_jif
.pdf
3-lekciya. Konteynerler (Kollekciyalar). STL kitapxanaları.
Konteyner klaslar. Sızıqlı konteynerler (array, vector, deque, list,
forward_list).
Jobası:
1. STL (Standard Template Library) túsinigi hám onıń komponentleri.
2. Konteynerlerdiń klassifikaciyası: Sızıqlı hám Associativ.
3. Sızıqlı konteynerler: `vector`, `array`, `deque`.
4. Dizimli konteynerler: `list` hám `forward_list`.
STL: C++ tili qúdiretiniń tiykarı
C++ tilinde programmalastırıw tek ǵana sintaksis hám OBP principlerin
biliw menen sheklenbeydi. Tildiń eń kúshli hám paydalı bólegi – bul "Standart
Shablonlar Kitapxanası" (STL - Standard Template Library). STL – bul
ulıwmalasqan programmalastırıw (generic programming) koncepciyasına
tiykarlanǵan, hár qıylı maǵlıwmatlar strukturasın (konteynerler) hám
algoritmlerdi óz ishine alǵan klasslar hám funkciyalar jıynaǵı. STL-diń eń úlken
artıqmashılıǵı – ol "tipke ǵárezsiz" (type-independent). Yaǵnıy, siz bir `vector`
konteynerin jaratıp, onıń ishine `int`, `double`, `string` yamasa ózińizdiń
`Student` obyektińizdi salıwıńız múmkin. Bunıń barlıǵı C++ shablonları
(templates) arqalı ámelge asırıladı.
STL úsh tiykarǵı komponentten turadı: 1) Konteynerler (Containers) –
maǵlıwmatlardı saqlawshı obyektler (mısalı, massiv, dizim). 2) Algoritmler
(Algorithms) – konteynerlerdegi maǵlıwmatlardı qayta islewshi funkciyalar
(mısalı, sortlaw, izlew, ózgertiw). 3) Iteratorlar (Iterators) – konteyner menen
algoritmler arasındaǵı "kópir". Iteratorlar konteynerdiń ishki dúzilisin bilmey,
onıń elementlerine izbe-iz baylanısıwǵa (traverse) imkaniyat beredi. Bul úshlik
bir-biri menen tıǵız baylanısqan: algoritmler iteratorlar arqalı konteynerler
menen isleydi.
Konteynerler ózleriniń maǵlıwmatlardı saqlaw hám olarǵa baylanısıw
usılına qaray eki úlken toparǵa bólinedi: "Sızıqlı konteynerler" (Sequence
Containers) hám "Associativ konteynerler" (Associative Containers). Sızıqlı
konteynerler maǵlıwmatlardı kirgiziliw tártibinde, bir sızıq boyınsha saqlaydı
(mısalı, massiv). Associativ konteynerler bolsa maǵlıwmatlardı sortlanǵan túrde

yamasa arnawlı gilt (key) arqalı saqlaydı (mısalı, binar terek, xesh-keste).
Bugingi lekciyada biz sızıqlı konteynerlerdi tereńirek úyrenemiz.
STL konteynerlerin qollanıwdıń ápiwayı massivlerden (`int arr[10]`)
qanday artıqmashılıǵı bar? Birinshiden, STL konteynerleri (kóbisi)
"dinamikalıq" – olar kerek bolǵanda óz kólemin avtomat túrde úlkeyte aladı.
Ekinshiden, olar qáwipsizirek hám kóp tayın metodlarǵa (size, empty,
push_back) iye. Úshinshiden, olar yadtı basqarıwdı (new/delete) programmistten
alıp, óz moynına aladı. STL – bul "velosipedti qayta oylap tabıwdan" qutılıwdıń
eń jaqsı jolı.
Vector: Eń kóp qollanılatuǵın dinamikalıq massiv
Sızıqlı konteynerlerdiń "patshası" – bul `std::vector`. Vector – bul
dinamikalıq massiv. Onıń elementleri yadda (RAM) izbe-iz, bir blokta jaylasadı.
Bul vector-diń eń úlken artıqmashılıǵın támiyinleydi: "Tosınnan baylanısıw"
(Random Access). Yaǵnıy, `v[5]` elementine baylanısıw waqtı `v[1000]`
elementine baylanısıw waqtı menen birdey (O(1) quramalılıq). Bul oqıw
operaciyaları ushın júdá tez. Vector-diń kólemi aldın ala belgilenbewi múmkin,
oǵan element qosqan sayın (`push_back`) ol keńeyip bara beredi. Vector-diń
islew principi tómendegishe: ol yadda ózine kerekli orınnan sál kóbirek orın
("Sıyımlılıq" - Capacity) alıp qoyadı. Mısalı, 10 element bolsa, 16 orın alıwı
múmkin. Eger siz 11-elementti qossańız, vector basqa jerden 32 orınlıq jańa
blok aladı, eski elementlerdi soǵan kóshiredi, eskisin óshiredi hám jańasın
qosadı. Bul process waqıt alıwı múmkin, biraq ol tez-tez bolmaydı. Sol sebepli
vector-dıń "aqırına element qosıw" operaciyası ortasha esapta júdá tez
(Amortized O(1)).
Biraq vector-dıń kemshilikleri de bar. Onıń "basına yamasa ortasına
element qosıw/óshiriw" júdá qımbatqa túsedi (O(N)). Sebebi, ortasına bir nárse
qosıw ushın, onnan keyingi barlıq elementlerdi bir qádem ońǵa jılıstırıw kerek.
Sol sebepli, eger sizge dizimniń ortasına tez-tez ózgeris kirgiziw kerek bolsa,
vector eń jaqsı tańlaw emes. Vector tiykarınan "bir ret jazıw, kóp ret oqıw"
yamasa "tek aqırına qosıw" scenariyleri ushın ideal.
Vector menen islesiwde `at()` metodın qollanıw usınıs etiledi. Ápiwayı
`[]` operatorı shegaradan shıǵıp ketiwdi (out of range) teksermeydi hám
programma qulawı múmkin. Al `v.at(i)` metodı shegaranı tekseredi hám qáte
bolsa `std::out_of_range` ayrıqsha jaǵdayın (exception) ılaqtıradı. Mısalı:
#include <iostream>
#include <vector>

using namespace std;
int main() {
vector<int> v = {1, 2, 3};
v.push_back(4); // Aqırına 4 qosıladı. Kólem: 4
cout << "2-element: " << v.at(1) << endl; // 2
cout << "Kólemi: " << v.size() << endl; // 4
v.pop_back(); // Aqırǵı elementti (4) óshiriw
// Iterator arqalı aylanıp shıǵıw
for (auto it = v.begin(); it != v.end(); ++it) {
cout << *it << " ";
}
return 0;
}
Array hám Deque: Statikalıq hám Eki tárepleme massivler
`std::array` – bul C++11 standartı menen kirgizilgen "statikalıq massiv"
konteyneri. Onıń kólemi kompilyaciya waqtında belgilenedi hám ózgermeydi
(mısalı, `array<int, 5>`). Ápiwayı C massivinen (`int a[5]`) ayırmashılıǵı – ol
STL interfeysine (size, begin, end metodlarına) iye hám qáwipsizirek.
`std::array` dinamikalıq yadtı (heap) qollanbaydı, stekte (stack) saqlanadı, sol
sebepli ol vector-dan sál tezirek bolıwı múmkin, biraq qolaylı emes. Eger
massiv kólemi ózgermeytuǵın bolsa, vector ornına array qollanǵan maqul.
`std::deque` (Double-Ended Queue) – bul "eki tárepleme gezek". Deque
(dek dep oqıladı) vector-ǵa júdá uqsas, biraq onıń eń úlken artıqmashılıǵı –
"basına element qosıw" (`push_front`) da júdá tez orınlanadı (O(1)). Vector tek
aqırına tez qossa, deque basına da, aqırına da tez qosadı. Deque yadda vector
sıyaqlı bir pútin blokta emes, al bir neshe kishi bloklarda (chunks) saqlanadı.
Bul oǵan yadtı qayta bólistirmey keńeyiwge imkaniyat beredi.

Deque-diń kemshiligi – onıń elementlerine baylanısıw vector-ǵa
qaraǵanda sál ástelew (sebebi bir neshe bloktı esaplaw kerek) hám iteratorları
quramalıraq. Sonday-aq, deque elementleri yadda izbe-iz jaylaspaǵanı ushın, ol
keshlendi (caching) vector-day jaqsı qollana almaydı. Deque tiykarınan "Gezek"
(Queue) hám "Stek" (Stack) strukturaların implementaciya etiw ushın
qollanıladı.
Mısalı:
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> d;
d.push_back(10); // Aqırına: {10}
d.push_front(5); // Basına: {5, 10}
d.push_back(15); // Aqırına: {5, 10, 15}
cout << "Bası: " << d.front() << endl; // 5
cout << "Aqırı: " << d.back() << endl; // 15
d.pop_front(); // Basınan óshiriw: {10, 15}
return 0;
}
List hám Forward_List: Baylanısqan dizimler
`std::list` – bul "eki tárepleme baylanısqan dizim" (Doubly Linked List).
List elementleri yaddıń hár jerinde shashırap jatadı. Hárbir element (túyin/node)
óziniń maǵlıwmatın, aldınǵı elementke siltemeni (pointer) hám keyingi
elementke siltemeni saqlaydı. List-tiń eń úlken artıqmashılıǵı – "qálegen jerge
(ortasına) element qosıw hám óshiriw" júdá tez (O(1)). Vector-daǵı sıyaqlı
elementlerdi jılıstırıwdıń keregi joq, tek siltemelerdi ózgertiw jetkilikli.

Biraq list-tiń úlken kemshiligi bar – onda "Tosınnan baylanısıw" (Random
Access) joq. Yaǵnıy, `myList[5]` dep jazıwǵa bolmaydı. 5-elementti alıw ushın,
dizimniń basınan baslap 1, 2, 3, 4 dep sanap barıw kerek (O(N)). Bul list-ti
úlken kólemdegi maǵlıwmatlar ishinen izlew ushın qolaysız etedi. Sonday-aq,
hárbir element ushın qosımsha eki silteme (pointer) saqlaw kerek bolǵanı ushın,
list vector-ǵa qaraǵanda kóbirek yad iyeleydi.
`std::forward_list` (C++11) – bul "bir tárepleme baylanısqan dizim"
(Singly Linked List). Ol tek keyingi elementke siltemeni saqlaydı (aldınǵısına
emes). Bul onı `std::list`-ten jeńilirek hám yadtı únemli qollanatuǵın etedi (C
massivine jaqın). Biraq onıń imkaniyatları sheklengen: tek alǵa qaray júriwge
boladı, artqa qaytıw múmkin emes. `forward_list` tiykarınan yad júdá
sheklengen sistemalarda qollanıladı.
Konteynelerdi qashan qollanıw kerek? Ulıwma qaǵıyda: "Eger qaysısın
qollanıwdı bilmeseńiz, `std::vector` qollanıń". Vector jaǵdaylardıń 90% inde eń
jaqsı nátiyje beredi. `std::list` tek eger sizge dizimniń ortasına tez-tez element
qosıw/óshiriw kerek bolsa hám elementlerge indeks arqalı baylanısıw kerek
bolmasa ǵana qollanılıwı tiyis. `std::deque` bolsa basına hám aqırına tez qosıw
kerek bolǵanda paydalı.
List mısalı:
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main() {
list<int> myList = {10, 20, 30};
// Iterator arqalı 20 nı tabıw
auto it = find(myList.begin(), myList.end(), 20);
if (it != myList.end()) {
// 20 nıń aldına 15 qosıw

myList.insert(it, 15); // {10, 15, 20, 30}
}
// Listti vector sıyaqlı indeks penen oqıy almaymız
// Tek iterator menen aylanıp shıǵamız
for (int x : myList) {
cout << x << " ";
}
return 0;
}
BAQLAW SORAWLARÍ:
1. STL (Standard Template Library) degende neni túsinesiz hám onıń úsh
tiykarǵı komponenti qaysılar?
2. `std::vector` hám `std::list` konteynerleriniń yadda jaylasıwı hám
elementke baylanısıw tezligi boyınsha ayırmashılıǵı nede?
3. `std::deque` konteyneriniń `std::vector` dan tiykarǵı artıqmashılıǵı (basına
qosıwda) qanday?
4. Nege `std::vector` da element qosqanda (push_back) geyde "qımbat"
(slow) operaciya bolıwı múmkin (capacity hám reallocation)?
5. `std::array` hám ápiwayı C-style massiviniń (`int a[10]`) ayırmashılıǵı
nede?
Соседние файлы в папке 2-semestr
