Изменяющие алгоритмы: 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 — локальная установка не требуется.
Все уроки этого курса
- Алгоритмы без изменения: find, count, all_of
- Изменяющие алгоритмы: transform, copy_if, replace
- Сортировка и разбиение: sort, stable_partition
- Числовые алгоритмы: accumulate, reduce, transform_reduce