std::replace, std::replace_if
Defined in header <algorithm> |
||
|---|---|---|
| (1) | ||
template< class ForwardIt, class T >
void replace( ForwardIt first, ForwardIt last,
const T& old_value, const T& new_value ); |
(до C++20) | |
template< class ForwardIt, class T >
constexpr void replace( ForwardIt first, ForwardIt last,
const T& old_value, const T& new_value );
|
(с C++20) | |
template< class ExecutionPolicy, class ForwardIt, class T >
void replace( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last,
const T& old_value, const T& new_value );
|
(2) | (с C++17) |
| (3) | ||
template< class ForwardIt, class UnaryPredicate, class T >
void replace_if( ForwardIt first, ForwardIt last,
UnaryPredicate p, const T& new_value ); |
(до C++20) | |
template< class ForwardIt, class UnaryPredicate, class T >
constexpr void replace_if( ForwardIt first, ForwardIt last,
UnaryPredicate p, const T& new_value );
|
(с C++20) | |
template< class ExecutionPolicy, class ForwardIt,
class UnaryPredicate, class T >
void replace_if( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last,
UnaryPredicate p, const T& new_value );
|
(4) | (с C++17) |
Заменяет все элементы, удовлетворяющие определённым критериям, на new_value в диапазоне [first, last).
old_value (используя operator==).p возвращает true.policy. Эти перегрузки не участвуют в разрешении перегрузок, если |
| (до C++20) |
|
| (с C++20) |
Параметры
| first, last | - | диапазон элементов для обработки |
| old_value | - | значение элементов, которые нужно заменить |
| policy | - | стратегия выполнения. См. стратегию выполнения для получения более подробной информации. |
| p | - | унарный предикат, который возвращает true, если значение элемента должно быть заменено. Выражение |
| new_value | - | значение, используемое в качестве замены |
| Требования к типу | ||
-ForwardIt должно удовлетворять требованиям LegacyForwardIterator. |
||
-UnaryPredicate должно удовлетворять требованиям Predicate. |
||
| Выражение | (до C++20) |
|
| (с C++20) |
Возвращаемое значение
(нет)
Сложность
Дано N как std::distance(first, last):
N сравнений с old_value с использованием operator==.N применений предиката p.Исключения
Перегрузки с параметром шаблона с именем ExecutionPolicy сообщают об ошибках следующим образом:
- Если выполнение функции, вызванной как часть алгоритма, выбрасывает исключение, и
ExecutionPolicy- одна из стандартных стратегий, тоstd::terminateвызывается. Для любой другойExecutionPolicy, поведение является определённым реализацией. - Если алгоритм не может выделить память, то выбрасывается
std::bad_alloc.
Примечания
Поскольку алгоритм принимает old_value и new_value по ссылке, он может иметь непредсказуемое поведение, если любой из них является ссылкой на элемент диапазона [first, last).
Возможная реализация
| replace |
|---|
template<class ForwardIt, class T>
void replace(ForwardIt first, ForwardIt last,
const T& old_value, const T& new_value)
{
for (; first != last; ++first)
if (*first == old_value)
*first = new_value;
} |
| replace_if |
template<class ForwardIt, class UnaryPredicate, class T>
void replace_if(ForwardIt first, ForwardIt last,
UnaryPredicate p, const T& new_value)
{
for (; first != last; ++first)
if (p(*first))
*first = new_value;
} |
Пример
Следующий код сначала заменяет все вхождения 8 на 88 в векторе целых чисел. Затем он заменяет все значения, меньшие 5 на 55.
#include <algorithm>
#include <array>
#include <functional>
#include <iostream>
int main()
{
std::array<int, 10> s{5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
std::replace(s.begin(), s.end(), 8, 88);
for (int a : s)
std::cout << a << ' ';
std::cout << '\n';
std::replace_if(s.begin(), s.end(),
std::bind(std::less<int>(), std::placeholders::_1, 5), 55);
for (int a : s)
std::cout << a << ' ';
std::cout << '\n';
}Вывод:
5 7 4 2 88 6 1 9 0 3 5 7 55 55 88 6 55 9 55 55
Отчёты об ошибках
Следующие отчёты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применён к | Поведение как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 283 | C++98 |
T должно было быть CopyAssignable (и EqualityComparableдля replace), но тип значения ForwardIt не всегдаявляется T и T не всегда является изменяемым в ForwardIt |
требовалось *first = new_valueбыть допустимым вместо |
См. также
| копирует диапазон, заменяя элементы, удовлетворяющие определённым критериям, другим значением (функция-шаблон) |
|
|
(C++20)(C++20) |
заменяет все значения, удовлетворяющие определённым критериям, другим значением (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/replace