std::ranges:: copy_n, std::ranges:: copy_n_result
std::ranges
| Non-modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Partitioning operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sorting operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Binary search operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Set operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Heap operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Minimum/maximum operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Permutation operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fold operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operations on uninitialized storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Return types | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Défini dans l'en-tête
<algorithm>
|
||
|
Signature d'appel
|
||
|
template
<
std::
input_iterator
I,
std::
weakly_incrementable
O
>
requires
std::
indirectly_copyable
<
I, O
>
|
(1) | (depuis C++20) |
|
Type auxiliaire
|
||
|
template
<
class
I,
class
O
>
using copy_n_result = ranges:: in_out_result < I, O > ; |
(2) | (depuis C++20) |
[
0
,
n
)
. Le comportement est indéfini si
result
se trouve dans la plage
[
first
,
first
+
n
)
(
ranges::copy_backward
pourrait être utilisé dans ce cas).
Les entités de type fonction décrites sur cette page sont des objets fonction d'algorithme (informellement appelés niebloids ), c'est-à-dire :
- Les listes d'arguments de template explicites ne peuvent pas être spécifiées lors de l'appel de l'une d'entre elles.
- Aucune d'entre elles n'est visible pour la recherche dépendante des arguments .
- Lorsque l'une d'entre elles est trouvée par la recherche non qualifiée normale comme nom à gauche de l'opérateur d'appel de fonction, la recherche dépendante des arguments est inhibée.
Table des matières |
Paramètres
| first | - | début de la plage d'éléments à copier |
| n | - | nombre d'éléments à copier |
| result | - | début de la plage de destination |
Valeur de retour
ranges
::
copy_n_result
{
first
+
n, result
+
n
}
ou plus formellement, une valeur de type
ranges::in_out_result
qui contient un itérateur
input_iterator
égal à
ranges::
next
(
first, n
)
et un itérateur
weakly_incrementable
égal à
ranges::
next
(
result, n
)
.
Complexité
Exactement n affectations.
Notes
En pratique, les implémentations de
std::ranges::copy_n
peuvent éviter les assignations multiples et utiliser des fonctions de copie en bloc telles que
std::memmove
si le type de valeur est
TriviallyCopyable
et que les types d'itérateurs satisfont
contiguous_iterator
. Alternativement, une telle accélération de copie peut être injectée durant une phase d'optimisation d'un compilateur.
Lors de la copie de plages qui se chevauchent,
std::ranges::copy_n
est approprié lors d'une copie vers la gauche (le début de la plage de destination est en dehors de la plage source) tandis que
std::ranges::copy_backward
est approprié lors d'une copie vers la droite (la fin de la plage de destination est en dehors de la plage source).
Implémentation possible
struct copy_n_fn { template<std::input_iterator I, std::weakly_incrementable O> requires std::indirectly_copyable<I, O> constexpr ranges::copy_n_result<I, O> operator()(I first, std::iter_difference_t<I> n, O result) const { for (; n-- > 0; (void)++first, (void)++result) *result = *first; return {std::move(first), std::move(result)}; } }; inline constexpr copy_n_fn copy_n{}; |
Exemple
#include <algorithm> #include <iomanip> #include <iostream> #include <iterator> #include <string> #include <string_view> int main() { const std::string_view in{"ABCDEFGH"}; std::string out; std::ranges::copy_n(in.begin(), 4, std::back_inserter(out)); std::cout << std::quoted(out) << '\n'; out = "abcdefgh"; const auto res{std::ranges::copy_n(in.begin(), 5, out.begin())}; const auto i{std::distance(std::begin(in), res.in)}; const auto j{std::distance(std::begin(out), res.out)}; std::cout << "in[" << i << "] = '" << in[i] << "'\n" << "out[" << j << "] = '" << out[j] << "'\n"; }
Sortie :
"ABCD" in[5] = 'F' out[5] = 'f'
Voir aussi
|
(C++20)
(C++20)
|
copie une plage d'éléments vers un nouvel emplacement
(objet fonction algorithme) |
|
(C++20)
|
copie une plage d'éléments dans l'ordre inverse
(objet fonction algorithme) |
|
(C++20)
(C++20)
|
copie une plage d'éléments en omettant ceux qui satisfont des critères spécifiques
(objet fonction algorithme) |
|
(C++20)
(C++20)
|
copie une plage en remplaçant les éléments satisfaisant des critères spécifiques par une autre valeur
(objet fonction algorithme) |
|
(C++20)
|
crée une copie d'une plage qui est inversée
(objet fonction algorithme) |
|
(C++20)
|
copie et fait pivoter une plage d'éléments
(objet fonction algorithme) |
|
(C++20)
|
crée une copie d'une plage d'éléments qui ne contient pas de doublons consécutifs
(objet fonction algorithme) |
|
(C++20)
|
déplace une plage d'éléments vers un nouvel emplacement
(objet fonction algorithme) |
|
(C++20)
|
déplace une plage d'éléments vers un nouvel emplacement dans l'ordre inverse
(objet fonction algorithme) |
|
(C++11)
|
copie un nombre d'éléments vers un nouvel emplacement
(modèle de fonction) |