Algoritm kutubxonasi
Odatda yangi boshlanuvchilar massiv elementlarini saralash, izlash yoki hisoblash kabi nisbatan sodda vazifalarni bajarish uchun odatiy ko’chadan yozishda ko’p vaqt sarflaydi. Ushbu ilmoqlar qanchalik osonlikcha xatoga yo’l qo’ishi mumkinligi nuqtai nazardan ham muammoli bo’lib qolishi mumkin. Bu ilmoqlarni tushinish qiyin bo’lib qolish mumkin.
Dasturlashda qidirish, hisoblash va saralash juda keng tarqalgan operatsiyalar bo'lgani uchun, C ++ standart kutubxonasi allaqachon bir nechta satr kodlarida ushbu vazifalarni bajaradigan katta funktsiyalar to'plamini o'z ichiga oladi. Bunga qo'shimcha ravishda, ushbu xususiyatlar allaqachon sinovdan o'tgan, samarali va har xil turdagi idishlarni qo'llab-quvvatlaydi. Va bu xususiyatlarning ba'zilari parallellashtirishni ham qo'llab-quvvatlaydi - uni tezroq bajarish uchun bir xil vazifa uchun bir nechta protsessor iplarini ajratish qobiliyati.
Algoritm kutubxonasi tomonidan taqdim etilgan funktsiyalar odatda uchta toifaga kiradi:
Tekshiruvchilar - konteynerdagi ma'lumotlarni (o'zgarishsiz) ko'rish uchun foydalaniladi (masalan, qidiruv operatsiyasi yoki hisoblash jarayoni).
Mutatorlar - konteynerdagi ma'lumotlarni o'zgartirish uchun ishlatiladi (masalan, elementlarni saralash yoki qayta tartiblash).
Fasilitatorlar - ma'lumotlar elementlari qiymatlari (masalan, qiymatlarni ko'paytiradigan ob'ektlar yoki elementlar juftligini qaysi tartibda saralash kerakligini aniqlaydigan ob'ektlar) asosida natija yaratish uchun foydalaniladi.
Ushbu algoritmlar algoritmlar kutubxonasida joylashgan (algoritm sarlavhali fayl). Ushbu qo'llanmada biz ba'zi keng tarqalgan algoritmlarni ko'rib chiqamiz.
Izoh: Ushbu algoritmlarning barchasi takrorlanuvchilardan foydalanadi.
Std :: find () algoritmi va qiymat bo'yicha elementni topish
Std :: find () funktsiyasi konteynerni berilgan qiymatning birinchi marta paydo bo'lishini qidiradi. Std :: find () argument sifatida 3 parametrni oladi:
ketma-ketlikdagi boshlang'ich element uchun iterator;
ketma-ketlikdagi so'nggi element uchun iterator;
qidirish uchun qiymat.
Natijada, iterator kerakli elementga (agar topilgan bo'lsa) yoki konteynerning oxiriga (agar bunday element c bo'lmasa) ishora qilgan holda qaytariladi, Izoh: Ushbu darsdagi barcha misollarning to'g'ri ishlashi uchun kompilyatoringiz sizning IDE-ning C ++ 17 funksiyalaridan foydalanish bo'yicha tafsilotlar, bu erda o'qing.
Element topilgan misol:
Qidirish va almashtirish uchun qiymatni kiriting:5 234
13 90 99 234 40 80
Element topilmaydigan misol:
Qidirish va almashtirish uchun qiymatni kiriting: 0 234
0 topilmadi
13 90 99 5 40 80
Std :: find_if () algoritmi va shartli elementlarni qidirish
Ba'zan biz konteynerda ba'zi bir shartlarga mos keladigan qiymatga ega ekanligini ko'rishni xohlaymiz (masalan, berilgan pastki qatorni o'z ichiga olgan qator).
Bunday holatlarda std :: find_if () funktsiyasi mukammal yordamchi bo'ladi. Bu std :: find () funktsiyasiga o'xshash ishlaydi, lekin qidirish uchun qiymatni berish o'rniga biz qo'ng'iroq qilinadigan ob'ektga o'tamiz, masalan funktsiya ko'rsatgichi (yoki lambda - bu haqda keyinroq), agar u tekshirilsa gugurt topildi. Std :: find_if () funktsiyasi har bir element uchun ushbu ob'ektni qidiradigan elementni topguncha chaqiradi (yoki idishda tekshirish uchun element qolmagan).
Std :: find_if () funktsiyasidan foydalanib, biron bir elementda "nut" substring mavjudligini tekshiramiz.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#include
#include
#include
#include
//Agar element topilsa, bizning funksiyamiz haqiqiy bo’ladi
boolcontainsNut(std::string_viewstr)
{
// std::string_view::find qaytadi std::string_view::npos, agar u substring topmasa.
// Aks holda, u substring sodir bo'lgan indeksni str-da qaytaradi.
return(str.find("nut")!=std::string_view::npos);
}
intmain()
{
std::arrayarr{"apple","banana","walnut","lemon"};
// Elementlardan birida substring mavjudligini ko'rish uchun biz massivimizni skanerlaymiz
autofound{std::find_if(arr.begin(),arr.end(),containsNut)};
if(found==arr.end())
{
std::cout<<"No nuts\n";
}
else
{
std::cout<<"Found "<<*found<<'\n';
}
return0;}
|
Dasturni bajarish natijasi: Found wal nut
Agar biz yuqoridagi muammoni odatdagi standart usulda hal qilsak, unda biz kamida ikkita siklga ehtiyoj sezamiz (bittasi massivni aylanib o'tish uchun, ikkinchisi pastki satrni taqqoslash uchun). C ++ standart kutubxonasining funktsiyalari sizga bir nechta satr kodlari bilan xuddi shunday qilishga imkon beradi!
Do'stlaringiz bilan baham: |