0Pricing
C++ Academy · Урок

Изменяющие алгоритмы: transform, copy_if, replace

Преобразуйте, фильтруйте и заменяйте элементы стандартными алгоритмами.

«Изменяющие алгоритмы: transform, copy_if, replace» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Модифицирующие алгоритмы

Эти алгоритмы записывают данные в выходной диапазон — непосредственно в него или через итератор назначения.

std::copy

Копирует один диапазон в другой. Выходной диапазон должен быть достаточно большим, либо необходимо предоставить итератор-вставщик.

#include <algorithm>
#include <iterator>
std::vector<int> src = {1, 2, 3};
std::vector<int> dst;
std::copy(src.begin(), src.end(), std::back_inserter(dst));

std::copy_if

Копирует элементы, соответствующие предикату.

std::vector<int> evens;
std::copy_if(src.begin(), src.end(),
    std::back_inserter(evens),
    [](int x) { return x % 2 == 0; });

std::transform

Применяет функцию к каждому элементу и записывает результат. Аналогично операции отображения в других языках.

std::vector<int> v = {1, 2, 3};
std::vector<int> sq;
std::transform(v.begin(), v.end(),
    std::back_inserter(sq),
    [](int x) { return x * x; });
// sq is {1, 4, 9}

transform для двух диапазонов

Объединяет два входных диапазона с помощью бинарной функции.

std::vector<int> a = {1, 2, 3};
std::vector<int> b = {10, 20, 30};
std::vector<int> sum;
std::transform(a.begin(), a.end(), b.begin(),
    std::back_inserter(sum), std::plus<int>{});
// sum is {11, 22, 33}

std::replace и std::replace_if

Заменяет на месте элементы, равные заданному значению или соответствующие предикату.

std::vector<int> v = {1, 2, 3, 2};
std::replace(v.begin(), v.end(), 2, 99);
// v is {1, 99, 3, 99}

std::fill

Устанавливает для каждого элемента диапазона заданное значение.

std::vector<int> v(5);
std::fill(v.begin(), v.end(), 42);
// v is {42, 42, 42, 42, 42}

std::generate

Устанавливает для каждого элемента результат вызова функции. Полезен для генерации последовательностей.

std::vector<int> v(5);
int n = 0;
std::generate(v.begin(), v.end(), [&]() { return n++; });
// v is {0, 1, 2, 3, 4}

std::iota

Из <numeric> — заполняет диапазон последовательно возрастающими значениями.

#include <numeric>
std::vector<int> v(5);
std::iota(v.begin(), v.end(), 10);
// v is {10, 11, 12, 13, 14}

std::reverse

Обращает порядок элементов диапазона на месте.

std::vector<int> v = {1, 2, 3, 4};
std::reverse(v.begin(), v.end());
// v is {4, 3, 2, 1}

std::rotate

Поворачивает элементы так, чтобы элемент в позиции middle стал первым. Изначально первый элемент перемещается в конец повернутой области.

Идиома erase-remove с std::remove

remove перемещает ненужные элементы в конец и возвращает итератор к новому логическому концу. Используйте его вместе с erase, чтобы фактически уменьшить размер.

v.erase(
    std::remove(v.begin(), v.end(), 0),
    v.end()
);

Быстрая проверка

Какой алгоритм лучше всего подходит, чтобы применить функцию к каждому элементу и создать новый контейнер?

Итоги

Модифицирующие алгоритмы записывают результаты: copy, copy_if, transform, replace, fill, generate, iota, reverse, rotate и идиома erase-remove.

Часто задаваемые вопросы

Урок «Изменяющие алгоритмы: transform, copy_if, replace» бесплатный?

Да — полный текст урока «Изменяющие алгоритмы: transform, copy_if, replace» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Изменяющие алгоритмы: transform, copy_if, replace»?

Преобразуйте, фильтруйте и заменяйте элементы стандартными алгоритмами. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Изменяющие алгоритмы: transform, copy_if, replace»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Алгоритмы без изменения: find, count, all_of
  2. Изменяющие алгоритмы: transform, copy_if, replace
  3. Сортировка и разбиение: sort, stable_partition
  4. Числовые алгоритмы: accumulate, reduce, transform_reduce
← Назад к C++ Academy