std::replac...ace_copy_if(3)
Manual page: std::replac...ace_copy_if(3) β C++ Standard Libary.
π NAME π
std::replace_copy, std::replace_copy_if β the copy-and-replace algorithms. The page literally says std::replace_copy,std::replace_copy_if, so bestie, we are covering both π«Ά.
β¨ Synopsis β¨
Defined in header <algorithm>.
template< class InputIt, class OutputIt, class T >
OutputIt replace_copy( InputIt first, InputIt last, OutputIt d_first,
const T& old_value, const T& new_value );
(1) β constexpr since C++20.
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class T >
ForwardIt2 replace_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 d_first,
const T& old_value, const T& new_value );
(2) β since C++17.
template< class InputIt, class OutputIt, class UnaryPred, class T >
OutputIt replace_copy_if( InputIt first, InputIt last, OutputIt d_first,
UnaryPred p, const T& new_value );
Annotation: (constexpr since C++20), (until C++26).
template< class InputIt, class OutputIt, class UnaryPred,
class T = typename std::iterator_traits<OutputIt>::value_type >
constexpr OutputIt replace_copy_if( InputIt first, InputIt last,
OutputIt d_first,
UnaryPred p, const T& new_value );
Annotation: (since C++26).
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
class UnaryPred, class T >
ForwardIt2 replace_copy_if( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 d_first,
UnaryPred p, const T& new_value );
(3) β since C++17, until C++26.
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
class UnaryPred,
class T = typename std::iterator_traits<ForwardIt2>::value_type >
ForwardIt2 replace_copy_if( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 d_first,
UnaryPred p, const T& new_value );
(4) β since C++26.
Copies the elements from the range [first, last) to another range beginning at d_first, while replacing all elements satisfying specific criteria with new_value.
1)Replaces all elements that are equal toold_value(usingoperator==).3)Replaces all elements for which predicatepreturns true.2,4)Same as(1,3), but executed according topolicy.
These overloads participate in overload resolution only if
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true. (until C++20)
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> is true. (since C++20)
If any of the results of the expressions*firstandnew_valueis not writable tod_first, the program is ill-formed.
If the source and destination ranges overlap, the behavior is undefined. That is not a vibe check you want to fail, bestie π
πΈ Parameters πΈ
first,lastβ the range of elements to copy.d_firstβ the beginning of the destination range.old_valueβ the value of elements to replace.policyβ the execution policy to use. See execution policy for details.pβ unary predicate which returnstrueif the element value should be replaced. The expressionp(v)must be convertible toboolfor every argumentvof type (possibly const)VT, whereVTis the value type ofInputIt, regardless of value category, and must not modifyv. Thus, a parameter type ofVT&is not allowed, nor isVTunless forVTa move is equivalent to a copy(since C++11).new_valueβ the value to use as replacement.
π¦ Type requirements π¦
InputItmust meet the requirements ofLegacyInputIterator.OutputItmust meet the requirements ofLegacyOutputIterator.ForwardIt1,ForwardIt2must meet the requirements ofLegacyForwardIterator.
π Return value π
Iterator to the element past the last element copied. Slay, that's literally it β¨.
π₯ Complexity π₯
Given N as std::distance(first, last):
1,2)ExactlyNcomparisons usingoperator==.3,4)ExactlyNapplications of the predicatep.
π Exceptions π
The overloads with a template parameter named ExecutionPolicy report errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception and
ExecutionPolicyis one of the standard policies,std::terminateis called. For any otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory,
std::bad_allocis thrown.
π§ Possible implementation π§
replace_copy
template<class InputIt, class OutputIt, class T>
OutputIt replace_copy(InputIt first, InputIt last, OutputIt d_first,
const T& old_value, const T& new_value)
{
for (; first != last; ++first)
*d_first++ = (*first == old_value) ? new_value : *first;
return d_first;
}
replace_copy_if
template<class InputIt, class OutputIt, class UnaryPred,
class T = typename std::iterator_traits<ForwardIt>::value_type>
OutputIt replace_copy_if(InputIt first, InputIt last, OutputIt d_first,
UnaryPred p, const T& new_value)
{
for (; first != last; ++first)
*d_first++ = p(*first) ? new_value : *first;
return d_first;
}
β Notes β
Feature-test macro: __cpp_lib_algorithm_default_value_type β value 202403 β std (C++26) β feature: List-initialization for algorithms (3,4).
π Example π
// Run this code
#include <algorithm>
#include <complex>
#include <iostream>
#include <vector>
void println(const auto& seq)
{
for (const auto& e : seq)
std::cout << e << ' ';
std::cout << '\n';
}
int main()
{
std::vector<short> src{3, 1, 4, 1, 5, 9, 2, 6, 5};
println(src);
std::vector<int> dst(src.size());
std::replace_copy_if(src.cbegin(), src.cend(),
dst.begin(),
[](short n){ return n > 5; }, 0);
println(dst);
std::vector<std::complex<double>> src2{{1, 3}, {2, 4}, {3, 5}},
dst2(src2.size());
println(src2);
#ifdef __cpp_lib_algorithm_default_value_type
std::replace_copy_if(src2.cbegin(), src2.cend(), dst2.begin(),
[](std::complex<double> z){ return std::abs(z) < 5; },
{4, 2}); // Possible, since the T is deduced.
#else
std::replace_copy_if(src2.cbegin(), src2.cend(), dst2.begin(),
[](std::complex<double> z){ return std::abs(z) < 5; },
std::complex<double>{4, 2});
#endif
println(dst2);
}
π Output π
3 1 4 1 5 9 2 6 5
3 1 4 1 5 0 2 0 5
(1,3) (2,4) (3,5)
(4,2) (4,2) (3,5)
π Defect reports π
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
LWG 283β applied to C++98. Behavior as published:Twas required to beCopyAssignable(andEqualityComparableforreplace_copy), but the value type ofInputItis not alwaysT. Correct behavior: removed the requirement.LWG 337β applied to C++98. Behavior as published:replace_copy_ifonly requiredInputItto meet the requirements ofLegacyIterator^[1]. Correct behavior: corrected toLegacyInputIterator.
1. β The actual defect in the C++ standard is that the template parameter InputIterator was misspecified as Iterator. This affects the type requirements because the C++ standard states that for the function templates in the algorithms library, the template type parameters whose name ends with Iterator imply the type requirements of the corresponding iterator categories.
π See also π
replace,replace_ifβ replaces all values satisfying specific criteria with another value (function template).remove,remove_ifβ removes elements satisfying specific criteria (function template).ranges::replace_copy,ranges::replace_copy_ifβ copies a range, replacing elements satisfying specific criteria with another value (niebloid)(C++20).
xoxo, your Unix bestie π
β source/version: http://cppreference.com Β· 2024.06.10 Β· page std::replac...ace_copy_if(3).
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms