std:: remove_copy, std:: remove_copy_if
|
Défini dans l'en-tête
<algorithm>
|
||
| (1) | ||
|
template
<
class
InputIt,
class
OutputIt,
class
T
>
OutputIt remove_copy
(
InputIt first, InputIt last,
|
(constexpr depuis C++20)
(jusqu'à C++26) |
|
|
template
<
class
InputIt,
class
OutputIt,
class
T
=
typename
std::
iterator_traits
|
(depuis C++26) | |
| (2) | ||
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
T
>
|
(depuis C++17)
(jusqu'à C++26) |
|
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
|
(depuis C++26) | |
|
template
<
class
InputIt,
class
OutputIt,
class
UnaryPred
>
OutputIt remove_copy_if
(
InputIt first, InputIt last,
|
(3) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
UnaryPred
>
|
(4) | (depuis C++17) |
Copie les éléments de la plage
[
first
,
last
)
, vers une autre plage commençant à
d_first
, en omettant les éléments qui satisfont des critères spécifiques.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true . |
(jusqu'à C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true . |
(depuis C++20) |
Si * d_first = * first est invalide (jusqu'à C++20) * first n'est pas accessible en écriture vers d_first (depuis C++20) , le programme est mal formé.
Si les plages source et destination se chevauchent, le comportement est indéfini.
Table des matières |
Paramètres
| first, last | - | la paire d'itérateurs définissant la plage source des éléments à copier |
| d_first | - | le début de la plage de destination |
| value | - | la valeur des éléments à ne pas copier |
| policy | - | la politique d'exécution à utiliser |
| Exigences de type | ||
-
InputIt
doit satisfaire aux exigences de
LegacyInputIterator
.
|
||
-
OutputIt
doit satisfaire aux exigences de
LegacyOutputIterator
.
|
||
-
ForwardIt1, ForwardIt2
doit satisfaire aux exigences de
LegacyForwardIterator
.
|
||
-
UnaryPred
doit satisfaire aux exigences de
Predicate
.
|
||
Valeur de retour
Itérateur vers l'élément suivant le dernier élément copié.
Complexité
Étant donné N comme std:: distance ( first, last ) :
Pour les surcharges avec une ExecutionPolicy, il peut y avoir un coût de performance si
ForwardIt1
's
value_type
n'est pas
MoveConstructible
.
Exceptions
Les surcharges avec un paramètre de modèle nommé
ExecutionPolicy
signalent les erreurs comme suit :
-
Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, le comportement est défini par l'implémentation. - Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.
Implémentation possible
| 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; } |
Notes
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type
|
202403
|
(C++26) | Initialisation par liste pour les algorithmes ( 1,2 ) |
Exemple
#include <algorithm> #include <complex> #include <iomanip> #include <iostream> #include <iterator> #include <string> #include <vector> int main() { // Supprime les caractères '#' à la volée. 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"; // Supprime la valeur {1, 3} à la volée. 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 est déduit #else std::complex<double>{1, 3}); #endif }
Sortie :
before: "#Return #Value #Optimization" after: "Return Value Optimization" (2,2)(4,8)
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 779 | C++98 |
T
devait être
EqualityComparable
, mais
le type de valeur de
ForwardIt
n'est pas toujours
T
|
requis que
*
d_first
=
*
first
soit valide à la place |
Voir aussi
|
supprime les éléments satisfaisant des critères spécifiques
(modèle de fonction) |
|
|
(C++11)
|
copie une plage d'éléments vers un nouvel emplacement
(modèle de fonction) |
|
(C++11)
|
copie une plage en divisant les éléments en deux groupes
(modèle de fonction) |
|
(C++20)
(C++20)
|
copie une plage d'éléments en omettant ceux qui satisfont des critères spécifiques
(objet fonction algorithme) |