multimap - Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash

multimap – map, juftlikda kalitlar unikal emas, takrorlanadigan to‘plam. Agar kalit bo‘yicha qidirsangiz, siz bitta qiymatni emas, balki bir xil kalit qiymatiga ega bo‘lgan elementlar to‘plamini olasiz. Dasturga ulanish uslubi:
multiset – set, juftlikda kalitlar unikal emas, takrorlanadigan to‘plam. Agar kalit bo‘yicha qidirsangiz, siz bitta qiymatni emas, balki bir xil kalit qiymatiga ega bo‘lgan elementlar to‘plamini olasiz. Dasturga ulanish uslubi:
Belgilar to‘plami bo‘lgan satr (qator)ni ham to‘plam sifatida qarash mumkin. Shuning uchun ixtiyoriy kutubxona satrlar bilan ishlash va ifodalash uchun o‘zining sinflarga ega. STLda satrlar ASCII va Unicode formatlarida ifodalanadi.
string — to‘plam, ASCII formatidagi bir baytli belgilar to‘plami; wstring — to‘plam, Unicode formatidagi ikki baytli belgilar to‘plami; Dasturga ulanish uslubi:
Shuningdek, belgilar to‘plami bo‘lgan, satrli oqimlarni ham to‘plam sifatida qarash mumkin. strstream-oddiy maʻlumotlar tiplarini STL-string ko‘rinishada saqlashni tashkil qilish uchun ishlatiladi. Dasturga ulanish uslubi:
Dasturlarni tahlil qilishni shu sinfdan boshlaymiz.
2.1-dastur. Satrli oqim to‘plam sifatida ishlatish
#include "stdafx.h" #include #include #include using namespace std;
int main(){
strstream xstr;
for (int i = 0; i < 10; i++)
{
xstr << "Demo " << i << endl;
}
cout << xstr.str() << endl; string str;
str.assign(xstr.str (), xstr.pcount()); cout << str.c_str() << endl;
system("pause"); return 0;
}
|
Satrli oqim - oqim oxirida bir null terminator bilan tugaydigan buferdir. Shuning uchun uning bo‘sh qolgan elemetlari ixtiyoriy belgi bilan to‘ldiriladi. Satrli oqimning haqiqiy qismini olish uchun pcount() elementlarni sanagichidan foydalanish mumkin. Keyin esa, satrli oqimning "haqiqiy qismi" olinadi va chop qilinadi.
Iteratorlar ham dinamik strukturaga ega to‘plamdir. Iterator dinamik maʻlumotlar tuzilmalarini amalga oshirishda juda muhim tushunchadir. Tushunishimiz uchun, iteratorni maʻlum bir cheklovlar bilan bir ko‘rsatkich sifatida abstrakt ko‘rinishda aniqlash mumkin. Sirasini aytganda, iterator umumiy tushuncha bo‘lib va bir ko‘rsatkich uchun obʻyekt to‘plami bo‘ladi, ammo ko‘rsatkich bu iterator emas. Iterator sinfini quyidagicha qurib olish mumkin:
2.2-dastur. Iteratorning sinfni qurish.
class Iterator{ T* pointer; public:
T* GetPointer (){
return this -> pointer;
}
void SetPointer (T* pointer){ this -> pointer = pointer;
}
|
Iteratorning baʻzi bir formallashtirilgan taʻriflari:
Iteratorlar to‘plam elementlariga kirishni taʻminlaydi. Har bir aniq STL sinfi uchun iteratorlar to‘plamda sinf ichida alohida aniqlanadi.
Iteratorlarning uch turi mavjud:
(forward) iterator - to‘plamni kichik indeksdan kattaroq indeksga o‘tkazish uchun;
reverse iterator - to‘plamni katta indeksdan kichikroq indeksli o‘tkazish uchun;
random access iterator - to‘plamdan tasofidiy, har qanday yo‘nalishda tanlash uchun.
To‘plamning yarim elementlarini o‘chirishga doir misol keltiramiz.
2.3-dastur. To‘plamning yarim elementlarini o‘chirish.
#include "stdafx.h" #include #include #include using namespace std;
void printInt (int number); int main (){
vector myVec; vector::iterator first, last; for (long i=0; i<10; i++){
myVec.push_back(i);
}
first = myVec.begin();
last = myVec.begin() + 5; if (last >= myVec.end()){
return - 1;
}
myVec.erase(first, last);
for_each (myVec.begin(), myVec.end(), printInt); system("pause");
return 0;
}
void printInt (int number)
{
cout << number << endl;
}
|
2.3-dasturdagi baʻzi funksiyalarni keyinroq tushuntirib o‘tamiz. Shuni ham tushunish kerakki, to‘plamning qandaydir elementi uchun iterator olishda to‘plamni ketma-ket o‘zgartirish iteratorni yaroqsiz holga keltirish mumkin.
Iteratorning iteratsiyasida oldinga va shunga o‘xshash orqaga o‘tish quyidagicha fragmenti asosida sodir bo‘ladi:
for (iterator element = begin(); element < end(); element++)
{ t = (*element); }
for (iterator element = end(); element < begin(); element--)
{ t = (*element); }
|
Tasodifiy tanlash iteratoridan foydalanganda, masalan, quyidagicha fragmentni yozish mumkin:
for (iterator element = begin(); element < end(); element+=2)
{ t = (*element); }
|
Barcha to‘plamlarda mavjud bo‘lgan asosiy usullar quyidagi 2.1-jadvalga keltiramiz.
2.1-jadval. To‘plam usullari.
№
|
nomi
|
vazifasi
|
1
|
empty
|
To‘plamni bo‘shligini tekshiradi
|
2
|
size
|
To‘plamning o‘lchamini qaytaradi
|
3
|
begin
|
To‘g‘ri iteratorning birinchi elementini ko‘rsatadi
|
4
|
end
|
To‘g‘ri iteratorning oxirgi elementini ko‘rsatadi. Elementi yo‘q to‘plamga oxirgisidan keyinga o‘tadi
|
5
|
rbegin
|
Teskari iteratorning birinchi elementini ko‘rsatadi
|
6
|
rend
|
Teskari iteratorning oxirgi elementini ko‘rsatadi.
|
7
|
clear
|
To‘plamni tozalash, barcha elementlarini o‘chiradi.
|
8
|
erase
|
Ajratilgan elementlarni to‘plamdan o‘chiradi.
|
9
|
capacity
|
To‘plamning sig‘imini qaytaradi, yaʻni bu to‘plam uchun
mumkin bo‘lgan elementlar soni (aslida to‘plam uchun qancha xotira ajratilganini qaytaradi);
|
To‘plamning sig‘imi (hajmi), boshida aytib o‘tilganidek, kerak bo‘lganda o‘zgaradi, yaʻni, agar to‘plam uchun ajratilgan barcha xotiralar to‘lgan bo‘lsa, unda yangi element qo‘shilganda, to‘plamning sig‘imi oshiriladi va o‘sishdan oldin undagi barcha qiymatlar yangi xotira maydoniga ko‘chiriladi - bu dasturchilar uchun juda qimmat amal bo‘lib hisoblanadi. Dasturlashda to’plamning hajmi va quvvati ishonch hosil qilish muhim dasturlash element hisoblanadi. To‘plamning sig‘imi turlicha ekanligiga ishonch hosil qilish uchun quyidagi dasturni keltiramiz.
2.4-dastur. To‘plamning sig‘imini tekshirish.
#include "stdafx.h" #include #include
using namespace std; int main(){ vector vec;
cout << "Real size of array in vector: " << vec.capacity() << endl; for (int j = 0; j < 25; j++){
vec.push_back (10);
}
cout << "Real size of array in vector: " << vec.capacity() << endl; system("pause");
return 0;
}
|
vector – eng ko‘p ishlatiladigan to‘plam vektor hisoblanadi. Bu to‘plamning operator[] operatoriga ega ekanligi juda qulay. Odatiy massiv kabi ishlatiladi. Xuddi shuningdek, bu operator map, deque, string i wstring to‘plamlariga ham mavjud.
Vektorning quvvati dinamik ravishda o‘zgarishini tushunish muhimdir. Odatda, multiplikativ yondashuv hajmini oshirish uchun ishlatiladi: zarur bo‘lsa, vektor uchun ajratilgan xotiraning marta soni ortadi, yaʻni, yangi element qo‘shib to‘plam sig‘imining oshirishga sabab bo‘lsa, operatsion tizimi dasturi uchun yangi xotira maydoni ajratadi. Masalan, ikki barobar katta bo‘lish uchun, eski xotira maydoni barcha elementlari nusxasi yangi qiymat qilib qo‘shish.
|