Ба ҷои навиштани сикл min_element, max_element, count, find ва accumulate-ро истифода баред ва мавқеъро дуруст бихонед.
Назария
Дарси 1 аз 5
Хониш: 10 дақиқа
Саволҳо: 5
навбатӣ
Ҳудудҳо, unique ва ҷойгузинӣ
Ҷойи қиматро дар вектори танзимшуда бо lower_bound ва upper_bound ёбед, нусхаҳои такрориро бо unique хориҷ кунед ва ҳамаи тартибҳоро бо next_permutation гузаред.
Дар вектор 10⁵ адад ҳаст. Шумо хурдтаринро ва ҷойи онро мехоҳед. Метавонед сикл бо best ва bestIndex нависед. Оё чизе ҳаст, ки аллакай инро мекунад ва бе хато мекунад?
Шумо sort(a.begin(), a.end()) ва binary_search-ро аллакай медонед. Онҳо ду узви як оилаанд. Китобхонаи C++ рафи функсияҳои хурд, зуд ва санҷидашударо дорад барои корҳое, ки шумо боз-боз бо сикл менависед: хурдтарин ҷузъ, чанд адад 7, ҷамъ, аввалин сифр. Онҳо вақтро сарфа мекунанд ва муҳимтар аз он, хаторо кам мекунанд. Ҳамаи онҳо ду аргументи якхела мегиранд: аз куҷо оғоз кардан ва дар куҷо қатъ кардан.
Ҷой қимат нест
a.begin() ҷойи катаки аввал аст. a.end() ҷойи якбора баъди катаки охирин аст. Чунин ҷой мавқеъ номида мешавад (номи он дар C++ итератор аст). Баъзе функсияҳо мавқеъ медиҳанд, на адад.
lo - a.begin()индекс аст: то аввал чанд катак фосила дорад.
auto ба компилятор иҷозат медиҳад, ки навъи мавқеъро худаш муайян кунад. Навъи он дароз аст ва навиштани он зарур нест.
Қуттии афзорҳо дар як барнома
n-ро бихонед, баъд n адад ва баъд адади x-ро. Хурдтарин адад ва мавқеи онро, ҷамъи ҳамаи ададҳоро, x чанд бор омадааст ва мавқеи аввалини x-ро чоп кунед (ё бигӯед, ки нест).
accumulate(b, e, start) ҳамаи ҷузъҳоро ба start илова мекунад ва ҷамъ навъи start-ро дорад. Бо 0-и оддӣ ҷамъ int мешавад ва 10⁵ адад бо андозаи 10⁵ онро пур мекунанд. 0LL онро long long мекунад.
Ин рӯйхати рафи функсияҳост:
min_element(b, e) ва max_element(b, e): мавқеи хурдтарин ё бузургтарин.
count(b, e, x): чанд ҷузъ ба x баробар аст.
find(b, e, x): мавқеи аввалини x ё e.
accumulate(b, e, start): start + ҳамаи ҷузъҳо, дар навъи start.
swap(x, y): ду тағйирёбандаи ҳар навъро ҷой иваз мекунад.
b ва e ҳар ду мавқеъ шуда метавонанд. a.begin() + 1, a.begin() + 5 танҳо катакҳои 1 то 4-ро иваз мекунад (охир дохил нест) ва s.begin(), s.end() бо сатр кор мекунад.
Сикл ё функсия?
Функсия аз сикли шумо тезтар нест. Он кӯтоҳтар аст ва онро миллионҳо барномасоз санҷидаанд. Онро вақте истифода баред, ки сикли шумо айнан ҳамин корро мекунад. Сикли худро вақте нависед, ки қоида махсус аст, масалан «хурдтарин адади тоқ».
Худатон иҷро кунед
Се супориши хурд. Ҳар кадом як функсия аз рафи функсияҳост.
count(b, e, x) мешуморад. accumulate(b, e, 0LL) дар long long ҷамъ мезанад.
reverse ва swap тартибро дар ҳамон ҷо иваз мекунанд. Ду мавқеи дилхоҳ як қисми векторро медиҳад.
8
4 7 -2 9 0 7 -2 3
7
min -2 at 2
sum 26
7 occurs 2 times
first 7 at 1
Оё медонед?
Аксари ин функсияҳо аз Standard Template Library омадаанд. Онро асосан Александр Степанов дар аввали солҳои 1990 тарҳрезӣ кард ва соли 1998 ба стандарти C++ ворид шуд. Фикри ӯ: алгоритмро як бор барои ҳар контейнер нависед ва бигзор он танҳо бо мавқеъҳо кор кунад. Барои ҳамин sort бо ҳамон ду аргумент дар вектор, сатр ва массиви оддӣ кор мекунад.
Калимаҳои калидӣ
итератормавқеъbeginохирaccumulate
Ман дар ин дарс чӣ омӯхтам?
✓ Мавқеъро бо * ба қимат ва бо - a.begin() ба индекс табдил медиҳам.