Namespaces
Variants

std::ranges:: copy_n, std::ranges:: copy_n_result

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace 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
Definiert im Header <algorithm>
Aufrufsignatur
template < std:: input_iterator I, std:: weakly_incrementable O >

erfordert std:: indirectly_copyable < I, O >
constexpr copy_n_result < I, O >

copy_n ( I first, std:: iter_difference_t < I > n, O result ) ;
(1) (seit C++20)
Hilfstyp
template < class I, class O >
using copy_n_result = ranges:: in_out_result < I, O > ;
(2) (seit C++20)
1) Kopiert exakt n Werte aus dem Bereich beginnend bei first in den Bereich beginnend bei result durch Ausführung von * ( result + i ) = * ( first + i ) für jede ganze Zahl in [ 0 , n ) . Das Verhalten ist undefiniert, wenn result innerhalb des Bereichs [ first , first + n ) liegt (in diesem Fall könnte ranges::copy_backward stattdessen verwendet werden).

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithm Function Objects (informell bekannt als Niebloids ), das heißt:

Inhaltsverzeichnis

Parameter

first - der Anfang des Bereichs der zu kopierenden Elemente
n - Anzahl der zu kopierenden Elemente
result - der Anfang des Zielbereichs

Rückgabewert

ranges :: copy_n_result { first + n, result + n } oder formaler gesagt, ein Wert vom Typ ranges::in_out_result der einen input_iterator Iterator gleich ranges:: next ( first, n ) und einen weakly_incrementable Iterator gleich ranges:: next ( result, n ) enthält.

Komplexität

Genau n Zuweisungen.

Hinweise

In der Praxis können Implementierungen von std::ranges::copy_n mehrere Zuweisungen vermeiden und Bulk-Kopierfunktionen wie std::memmove verwenden, wenn der Werttyp TriviallyCopyable ist und die Iteratortypen contiguous_iterator erfüllen. Alternativ kann eine solche Kopierbeschleunigung während einer Optimierungsphase eines Compilers eingefügt werden.

Beim Kopieren überlappender Bereiche ist std::ranges::copy_n geeignet, wenn nach links kopiert wird (Anfang des Zielbereichs liegt außerhalb des Quellbereichs), während std::ranges::copy_backward geeignet ist, wenn nach rechts kopiert wird (Ende des Zielbereichs liegt außerhalb des Quellbereichs).

Mögliche Implementierung

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{};

Beispiel

#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";
}

Ausgabe:

"ABCD"
in[5] = 'F'
out[5] = 'f'

Siehe auch

kopiert eine Reihe von Elementen an einen neuen Speicherort
(Algorithmus-Funktionsobjekt)
kopiert eine Reihe von Elementen in umgekehrter Reihenfolge
(Algorithmus-Funktionsobjekt)
kopiert eine Reihe von Elementen unter Auslassung derjenigen, die bestimmte Kriterien erfüllen
(Algorithmus-Funktionsobjekt)
kopiert einen Bereich und ersetzt Elemente, die bestimmte Kriterien erfüllen, durch einen anderen Wert
(Algorithmus-Funktionsobjekt)
erstellt eine Kopie eines Bereichs, der umgekehrt ist
(Algorithmus-Funktionsobjekt)
kopiert und rotiert eine Reihe von Elementen
(Algorithmus-Funktionsobjekt)
erstellt eine Kopie eines Bereichs von Elementen, die keine aufeinanderfolgenden Duplikate enthält
(Algorithmus-Funktionsobjekt)
verschiebt eine Reihe von Elementen an einen neuen Speicherort
(Algorithmus-Funktionsobjekt)
verschiebt eine Reihe von Elementen in umgekehrter Reihenfolge an einen neuen Speicherort
(Algorithmus-Funktionsobjekt)
(C++11)
kopiert eine Anzahl von Elementen an einen neuen Speicherort
(Funktionstemplate)