std::remove_copy, std::remove_copy_if
(on partitioned ranges)
<algorithm>
OutputIt remove_copy( InputIt first, InputIt last,
class T = typename std::iterator_traits
<InputIt>::value_type >
constexpr OutputIt remove_copy( InputIt first, InputIt last,
class ForwardIt1, class ForwardIt2, class T >
ForwardIt2 remove_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
class ForwardIt1, class ForwardIt2,
class T = typename std::iterator_traits
<ForwardIt1>::value_type >
ForwardIt2 remove_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
OutputIt remove_copy_if( InputIt first, InputIt last,
class ForwardIt1, class ForwardIt2, class UnaryPred >
ForwardIt2 remove_copy_if( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
Copies elements from the range [
first,
last)
, to another range beginning at d_first, omitting the elements which satisfy specific criteria.
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 *d_first = *first is invalid(until C++20)*first is not writable to d_first(since C++20), the program is ill-formed.
If source and destination ranges overlap, the behavior is undefined.
InputIt
must meet the requirements of LegacyInputIterator.
OutputIt
must meet the requirements of LegacyOutputIterator.
ForwardIt1, ForwardIt2
must meet the requirements of LegacyForwardIterator.
UnaryPred
must meet the requirements of Predicate.
Iterator to the element past the last element copied.
Given \(\scriptsize N\)N as std::distance (first, last):
For the overloads with an ExecutionPolicy, there may be a performance cost if ForwardIt1
's value_type
is not MoveConstructible.
The overloads with a template parameter named ExecutionPolicy
report errors as follows:
ExecutionPolicy
is one of the standard policies, std::terminate is called. For any other ExecutionPolicy
, the behavior is implementation-defined.
remove_copy (1) |
---|
template<class InputIt, class OutputIt, class T = typename std::iterator_traits <InputIt>::value_type> constexpr OutputIt remove_copy(InputIt first, InputIt last, OutputIt d_first, const T& value) { for (; first != last; ++first) if (!(*first == value)) *d_first++ = *first; return d_first; } |
remove_copy_if (3) |
template<class InputIt, class OutputIt, class UnaryPred> constexpr OutputIt remove_copy_if(InputIt first, InputIt last, OutputIt d_first, UnaryPred p) { for (; first != last; ++first) if (!p(*first)) *d_first++ = *first; return d_first; } |
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403 |
(C++26) | List-initialization for algorithms (1,2) |
#include <algorithm> #include <complex> #include <iomanip> #include <iostream> #include <iterator> #include <string> #include <vector> int main() { // Erase the hash characters '#' on the fly. std::string str = "#Return #Value #Optimization"; std::cout << "before: " << std::quoted (str) << '\n'; std::cout << "after: \""; std::remove_copy(str.begin(), str.end(), std::ostream_iterator <char>(std::cout ), '#'); std::cout << "\"\n"; // Erase {1, 3} value on the fly. std::vector <std::complex <double>> nums{{2, 2}, {1, 3}, {4, 8}, {1, 3}}; std::remove_copy(nums.begin(), nums.end(), std::ostream_iterator <std::complex <double>>(std::cout ), #ifdef __cpp_lib_algorithm_default_value_type {1, 3}); // T gets deduced #else std::complex <double>{1, 3}); #endif }
Output:
before: "#Return #Value #Optimization" after: "Return Value Optimization" (2,2)(4,8)
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 779 | C++98 | T was required to be EqualityComparable, butthe value type of ForwardIt is not always T
|
required *d_first = *first to be valid instead |