Українська
Алгоритми стандартної бібліотеки
Пошук, відбір, сортування та переставлення
find порівнює зі значенням, find_if застосовує умову, count_if рахує відповідні елементи. any_of і all_of виражають існування та універсальну перевірку. Для порожнього діапазону any_of дає false, а all_of – true: немає елемента, який порушує вимогу. Якщо порожній набір недопустимий у домені, перевіряйте його окремо.
sort не гарантує збереження порядку еквівалентних елементів; stable_sort гарантує. partial_sort(first,middle,last) впорядковує лише потрібний найменший префікс, решта не має гарантованого порядку. Умова middle всередині допустимого діапазону є відповідальністю викликача.
unique прибирає лише сусідні дублікати логічно, подібно до remove. Для глобального усунення повторів часто спершу сортують, але це змінює початковий порядок. Якщо порядок першої появи важливий, потрібен інший алгоритм із множиною вже побачених значень. Назва unique не означає автоматичної глобальної унікальності.
binary_search і lower_bound потребують належно впорядкованого або розбитого відповідно до умови діапазону. Відсортувати за спаданням і шукати типовим less некоректно. Для map/set метод lower_bound використовує дерево; загальний алгоритм на їхніх ітераторах може вимагати лінійної кількості переходів.
transform обчислює нові значення, copy_if зберігає лише відібрані. Потрібно забезпечити місце призначення та дозволене перекриття. Читання й запис у той самий діапазон дозволені не для всіх довільних комбінацій алгоритмів.
Аналітика продажів
Умова. Для заданих сум знайти підсумок, кількість великих продажів і порядок за спаданням.
cpp
#include <algorithm>
#include <numeric>
#include <print>
#include <vector>
int main()
{
std::vector<int> sales{30, 10, 20, 10};
auto sum = std::accumulate(sales.begin(), sales.end(), 0);
auto count = std::count_if(sales.begin(), sales.end(),
[](int value) { return value >= 20; });
std::sort(sales.begin(), sales.end(),
[](int x, int y) { return x > y; });
std::println("sum: {}, large: {}", sum, count);
for (int value : sales) std::print("{} ", value);
std::println();
}Результат виконання:
text
sum: 70, large: 2
30 20 10 10Початкове значення 0 у accumulate задає цілий тип накопичення. Для дійсних чисел слід використати 0.0; інакше проміжні результати можуть втрачати дробову частину. Тут малі цілі суми не переповнюються. Порядок sales змінено сортуванням, а не лише виглядом звіту.
Числові алгоритми та асоціативність
accumulate виконує послідовне згортання з початковим значенням. reduce дозволяє інше групування операцій, навіть без явної паралельної політики. Для додавання дійсних чисел це може змінити останні цифри через округлення. Для віднімання чи конкатенації з особливим порядком така заміна може змінити сам зміст результату.
iota заповнює послідовністю, inner_product накопичує попарні добутки, partial_sum обчислює префіксні суми. У класичному inner_product друга послідовність повинна мати достатню кількість елементів; переданий лише її початок не дає алгоритму перевірити довжину. Передумову треба перевірити до виклику або вибрати інший інтерфейс.
std::ranges::fold_left C++23 явно описує ліве згортання і зручно працює з діапазоном. Наявність нового інтерфейсу не скасовує переповнення цілих чисел чи похибки дійсних. Тип початкового значення та тип результату операції залишаються частиною математичної моделі.