Добавил:
bekan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:2-semestr / 4-lekciya_jif
.pdf
4-lekciya. Associativ konteynerler. Associativ konteynerler (set, map,
multiset, multimap).
Jobası:
1. Associativ konteynerlerdiń sızıqlı konteynerlerden ayırmashılıǵı hám
islew principi (Binary Search Tree).
2. `std::set` hám `std::multiset`: Unikal hám tákirarlanıwshı giltler jıynaǵı.
3. `std::map` hám `std::multimap`: Gilt-Mánis (Key-Value) jubı.
4. Associativ konteynerlerdiń ámeliy qollanılıwı hám ónimliligi.
Associativ konteynerler hám Binar Terekler
Aldınǵı lekciyada ótken sızıqlı konteynerler (`vector`, `list`)
maǵlıwmatlardı biz kirgizgen tártipte saqlaytuǵın edi. Al "Associativ
konteynerler" (Associative Containers) bolsa maǵlıwmatlardı avtomat túrde
"sortlanǵan" (retlengen) túrde saqlaydı. Olardıń tiykarǵı maqseti –
maǵlıwmatlardı júdá tez izlep tabıw (Fast Retrieval). Associativ konteynerler
elementlerdi izlew ushın O(log N) waqıt jumsaydı, bul `vector` yamasa `list`
tegi izlewden (O(N)) ádewir tez. Mısalı, 1 million element ishinen birewin tabıw
ushın vector 1 million salıstırıw islese, associativ konteyner ~20 salıstırıw
isleydi. C++ STL-degi associativ konteynerler (set, map) ádette "Qızıl-Qara
Terek" (Red-Black Tree) dep atalatuǵın balanslanǵan binar izlew teregi (Self-
balancing Binary Search Tree) strukturası tiykarında implementaciya etilgen.
Bul terek strukturası elementlerdi bárqulla sortlap uslaydı. Hárbir element
(túyin) ózinen kishi elementti shepke, úlkenin ońǵa qoyadı. Sol sebepli,
konteynerge jańa element qosqanda, ol eń aqırına emes, al óziniń "tiyisli ornına"
(alfavit yamasa san boyınsha) qoyıladı. Bul `push_back` operaciyasınıń joq
ekenin bildiredi, tek `insert` bar.
Associativ konteynerler eki túrge bólinedi: 1) Tek "Giltlerdi" (Keys)
saqlawshı konteynerler (`set`, `multiset`). Bul matematikalıq jıynaqlarga (sets)
uqsas. 2) "Gilt-Mánis" (Key-Value) jubın saqlawshı konteynerler (`map`,
`multimap`). Bunda izlew gilt boyınsha júrgiziledi, al nátiyje retinde mánis
alınadı (mısalı, sózlikte sózdi izlep, onıń awdarmasın alıw). Sonday-aq, "Multi"
qollawshısı bar konteynerler (`multiset`, `multimap`) birdey giltlerdiń
qaytalanıwına ruqsat beredi, al ápiwayı `set` hám `map` tek unikal giltlerdi
saqlaydı.

Associativ konteynerlerdiń iteratorları "Eki tárepleme" (Bidirectional)
bolıp tabıladı. Yaǵnıy, biz `begin()` nen baslap `end()` ke shekem júrsek
(`++it`), elementler ósiw tártibinde (sortlanǵan) shıǵadı. Eger `rbegin()` nen
baslap `rend()` ke shekem júrsek, kemeyiw tártibinde shıǵadı. Biraq associativ
konteynerlerde `it + 5` sıyaqlı "Tosınnan baylanısıw" (Random Access) joq,
sebebi terekte 5-elementke birden sekirip ótiw múmkin emes, tek izbe-iz júriw
kerek.
Set hám Multiset: Taza jıynaqlar
`std::set` – bul unikal elementler jıynaǵı. Eger siz `set` ke bir elementti eki
ret qossańız (`insert`), ekinshisi qabıl etilmeydi. `set` kóbinese "Bul element bar
ma, joq pa?" degen sorawǵa tez juwap beriw ushın yamasa dublikatlardı
(qaytalanıwlardı) avtomat túrde alıp taslaw ushın qollanıladı. Mısalı, teksttegi
barlıq unikal sózlerdiń dizimin shıǵarıw ushın `set` eń qolaylı qural. `set`
elementleriniń mánisi ózgertilmeydi (const), sebebi mánisti ózgertiw sortlaw
tártibin buzıwı múmkin. Ózgertiw ushın elementti óshirip (`erase`), jańasın
qosıw (`insert`) kerek.
`std::multiset` bolsa `set` ke uqsas, biraq ol dublikatlarǵa ruqsat beredi.
Mısalı, eger siz {5, 3, 5, 1} sanların `multiset` ke qossańız, ol {1, 3, 5, 5} dep
saqlaydı. `multiset` te elementti izlegende (`find`), ol birinshi ushırasqan
elementtiń iteratorın qaytaradı. Barlıq nusqaların tabıw ushın `count()` (sanın
biliw) yamasa `equal_range()` (barlıq nusqalar diapazonın alıw) metodları
qollanıladı.
`set` hám `multiset` tiń eń áhmiyetli metodları: `insert(x)` – qosıw (O(log
N)), `erase(x)` – óshiriw (O(log N)), `find(x)` – izlew (O(log N)), `count(x)` –
bar ekenin tekseriw (1 yamasa 0, multiset-te sanı). Eger siz `std::find` (algorithm
kitapxanasınan) qollansańız, ol O(N) waqıt aladı, al `set::find` (klass metodı)
O(log N) waqıt aladı. Sol sebepli associativ konteynerler menen bárhama
olardıń óz metodların qollanıw kerek.
Mısalı:
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;

s.insert(10);
s.insert(5);
s.insert(20);
s.insert(10); // Qaytalanǵan, qosılmaydı
cout << "Kólemi: " << s.size() << endl; // 3
// Avtomat sortlanıp shıǵadı: 5, 10, 20
for (int x : s) {
cout << x << " ";
}
cout << endl;
if (s.find(5) != s.end()) {
cout << "5 tabıldı." << endl;
}
return 0;
}
Map hám Multimap: Gilt-Mánis jubı
`std::map` (Associativ massiv / Dictionary) – bul eń paydalı hám kúshli
konteynerlerden biri. Ol maǵlıwmatlardı `pair<const Key, Value>` (Jup)
kórinisinde saqlaydı. `Key` (Gilt) – bul unikal identifikator (mısalı, studenttiń ID
nomeri yamasa sóz), `Value` (Mánis) – bul sol giltke sáykes keletuǵın
maǵlıwmat (mısalı, studenttiń bahası yamasa sózdiń mánisi). Map elementleri
Gilt (Key) boyınsha sortlanadı. Map-tıń eń qolaylı tárepi – ol `[]` operatorın
qollap-quwatlaydı. `myMap["alma"] = 5` dep jazıw arqalı biz "alma" giltine 5
mánisin qosamız yamasa jańalaymız.
Map-ta `[]` operatorın qollanǵanda abaylı bolıw kerek. Eger siz `cout <<
myMap["limon"]` dep jazsańız hám "limon" gilti map-ta joq bolsa, map avtomat

túrde "limon" giltin jaratadı hám oǵan 0 (yamasa default) mánisin beredi. Eger
siz tek barlıǵın tekseriwdi qáleseńiz, `find()` yamasa `count()` qollanıwıńız
kerek. `std::multimap` bolsa `map` qa uqsas, biraq bir giltke bir neshe mánis
sáykes keliwi múmkin (mısalı, bir avtorda bir neshe kitap bar). Multimap-ta `[]`
operatorı joq, sebebi bir giltke qaysı mánisti beriw kerekligi belgisiz.
Map hám Multimap ta `insert`, `erase`, `find` metodlarına iye. Olar da
Qızıl-Qara terekte saqlanadı, sonıń ushın izlew tezligi O(log N). Giltlerdiń tipi
salıstırılıwǵa (`operator<`) jaramlı bolıwı shárt (mısalı, int, string, pair). Eger siz
ózińizdiń `Student` klasıńızdı gilt etpekshi bolsańız, onda `operator<` di
júklewińiz (overload) kerek boladı.
Mısalı:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> phonebook;
// Element qosıw (eki usıl)
phonebook["Azamat"] = 12345;
phonebook.insert(make_pair("Guli", 67890));
// Mánisti ózgertiw
phonebook["Azamat"] = 11111;
// Izlew
if (phonebook.count("Guli")) {
cout << "Guli-diń nomeri: " << phonebook["Guli"] << endl;
}

// Barlıǵın shıǵarıw (Gilt boyınsha sortlanǵan: Azamat, Guli)
for (auto const& [name, number] : phonebook) { // C++17
cout << name << ": " << number << endl;
}
return 0;
}
Associativ konteynerlerdiń ámeliy qollanılıwı
Qaysı jaǵdayda `vector` emes, al `set` yamasa `map` tańlaw kerek? 1)
Eger sizge maǵlıwmatlardıń turaqlı sortlanǵan bolıwı kerek bolsa. Vector-dı hár
saparı sortlaw (`std::sort`) qımbatqa túsedi (O(N log N)), al `set/map` bárhama
sortlanǵan bolıp turadı. 2) Eger sizge tez izlew kerek bolsa. Vector-da element
bar ekenin biliw ushın onıń aqırına shekem izlew kerek (O(N)), al `set/map` ta
bul birneshe operaciya menen tabıladı. 3) Eger sizge san emes, al tekst (string)
boyınsha indekslew kerek bolsa (Associativ massiv).
Degen menen, associativ konteynerlerdiń de kemshilikleri bar. 1) Olar
`vector`-ǵa qaraǵanda kóbirek yad (memory) iyeleydi, sebebi hárbir element
ushın terek túyinlerin (node) hám kórsetkishlerin (pointer) saqlaw kerek. 2)
Element qosıw hám óshiriw `vector::push_back` ke qaraǵanda ástelew (O(log
N) vs O(1)). 3) Olar yadda shashırap jatqanı ushın keshlendi (cache) effektli
qollana almaydı.
C++11 standartında "Retsiz associativ konteynerler" (Unordered
Associative Containers) payda boldı: `unordered_set`, `unordered_map`. Olar
terek emes, al "Xesh-keste" (Hash Table) tiykarında isleydi. Olarda izlew tezligi
ortasha O(1) (júdá tez!), biraq elementler sortlanbaǵan boladı. Eger sizge tártip
(sortlaw) áhmiyetli bolmasa, tek tez izlew kerek bolsa, `unordered_map` eń jaqsı
tańlaw bolıwı múmkin. Biraq klassikalıq `map` hám `set` turaqlı ónimlilik hám
tártip kepilligin beredi. Juwmaqlap aytqanda, `set` – bul unikal dizim, `map` –
bul sózlik. Olar programmistke quramalı izlew algoritmlerin jazbay-aq, úlken
kólemdegi maǵlıwmatlardı effektiv basqarıwǵa imkaniyat beredi. STL
konteynerlerin (vector, list, map, set) durıs kombinaciyalaw – sapalı C++
programmasın jazıwdıń gilti.

BAQLAW SORAWLARÍ:
1. Sızıqlı konteynerler (vector) menen Associativ konteynerler (set/map)
arasındaǵı tiykarǵı ayırmashılıq (izlew tezligi hám tártip) nede?
2. `std::set` hám `std::multiset` konteynerleriniń ayırmashılıǵı qanday?
3. `std::map` ta element qosıw ushın `[]` operatorın qollanıw menen
`insert()` metodın qollanıwdıń ayırmashılıǵı nede?
4. `std::map` konteyneri elementlerdi qaysı tártipte (Gilt pe, Mánis pe?)
sortlap saqlaydı?
5. Associativ konteynerler (`set`, `map`) qanday maǵlıwmatlar strukturasına
(Binar terek) tiykarlanǵan?
Соседние файлы в папке 2-semestr
