Данные · Контейнеры и алгоритмы

Алгоритмы и ranges

Не пиши цикл, если для этого есть алгоритм

~35 мин 7 шагов

После урока ты сможешь

  • Сортировать, искать и считать через std::ranges
  • Сортировать структуры по своему правилу
  • Строить конвейеры из views::filter и views::transform

Шаг 1 из 7

Не пиши цикл, если есть алгоритм

Вот два способа найти, есть ли в списке отрицательное число:

bool hasNegative = false;
for (const int v : values) {
    if (v < 0) {
        hasNegative = true;
        break;
    }
}
​
const bool hasNegative = std::ranges::any_of(values, [](int v) { return v < 0; });

Второй вариант не только короче. Он сразу говорит, что делается («есть ли хоть один…»), а не как. Цикл приходится прочитать целиком, чтобы понять его смысл. Стандартные алгоритмы к тому же проверены миллионами программ и не ошибаются на единицу.

Алгоритмы живут в <algorithm> (и немного в <numeric>). В C++20 у них появились версии из пространства std::ranges: им передают контейнер целиком, а не пару итераторов.