Namespaces
Variants

std:: copy, std:: copy_if

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
copy copy_if
(C++11)
(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
Definiert in Header <algorithm>
template < class InputIt, class OutputIt >

OutputIt copy ( InputIt first, InputIt last,

OutputIt d_first ) ;
(1) (constexpr seit C++20)
template < class ExecutionPolicy,

class ForwardIt1, class ForwardIt2 >
ForwardIt2 copy ( ExecutionPolicy && policy,
ForwardIt1 first, ForwardIt1 last,

ForwardIt2 d_first ) ;
(2) (seit C++17)
template < class InputIt, class OutputIt, class UnaryPred >

OutputIt copy_if ( InputIt first, InputIt last,

OutputIt d_first, UnaryPred pred ) ;
(3) (seit C++11)
(constexpr seit C++20)
template < class ExecutionPolicy,

class ForwardIt1, class ForwardIt2, class UnaryPred >
ForwardIt2 copy_if ( ExecutionPolicy && policy,
ForwardIt1 first, ForwardIt1 last,

ForwardIt2 d_first, UnaryPred pred ) ;
(4) (seit C++17)

Kopiert die Elemente im Bereich, definiert durch [ first , last ) , in einen anderen Bereich beginnend bei d_first (Zielbereich für die Kopie).

1) Kopiert alle Elemente im Bereich [ first , last ) beginnend bei first und fortfahrend bis last .
Falls d_first innerhalb von [ first , last ) liegt, ist das Verhalten undefiniert. In diesem Fall kann stattdessen std::copy_backward verwendet werden.
2) Kopiert die Elemente, aber ausgeführt gemäß der policy .
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> ist true .

(bis C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> ist true .

(seit C++20)
Wenn [ first , last ) und der Zielbereich überlappen, ist das Verhalten undefiniert.
3) Kopiert nur die Elemente, für die das Prädikat pred den Wert true zurückgibt. Dieser Kopieralgorithmus ist stabil: Die relative Reihenfolge der kopierten Elemente bleibt erhalten.
Wenn [ first , last ) und der Zielbereich überlappen, ist das Verhalten undefiniert.
4) Gleich wie (3) , aber ausgeführt gemäß policy .
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> ist true .

(bis C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> ist true .

(seit C++20)

Inhaltsverzeichnis

Parameter

first, last - das Iteratorpaar, das den Quell- Bereich der zu kopierenden Elemente definiert
d_first - der Anfang des Zielbereichs
policy - die zu verwendende Ausführungsrichtlinie
pred - unäres Prädikat, das ​ true für die erforderlichen Elemente zurückgibt.

Der Ausdruck pred ( v ) muss für jedes Argument v vom Typ (möglicherweise const) VT , wobei VT der Werttyp von InputIt ist, unabhängig von der Wertkategorie , in bool konvertierbar sein und darf v nicht modifizieren. Daher ist ein Parametertyp VT & nicht zulässig , ebenso wenig wie VT , es sei denn, für VT ist eine Verschiebung äquivalent zu einer Kopie (seit C++11) . ​

Typanforderungen
-
InputIt muss die Anforderungen von LegacyInputIterator erfüllen.
-
OutputIt muss die Anforderungen von LegacyOutputIterator erfüllen.
-
ForwardIt1, ForwardIt2 muss die Anforderungen von LegacyForwardIterator erfüllen.
-
UnaryPred muss die Anforderungen von Predicate erfüllen.

Rückgabewert

Ausgabeiterator auf das Element im Zielbereich, eines hinter dem zuletzt kopierten Element.

Komplexität

Gegeben N als std:: distance ( first, last ) :

1,2) Genau N Zuweisungen.
3,4) Genau N Anwendungen des Prädikats pred , und höchstens N Zuweisungen.

Für die Überladungen mit einer ExecutionPolicy kann es Leistungseinbußen geben, wenn der Werttyp von ForwardIt1 nicht MoveConstructible ist.

Ausnahmen

Die Überladungen mit einem Template-Parameter namens ExecutionPolicy melden Fehler wie folgt:

  • Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und ExecutionPolicy einer der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher allozieren kann, wird std::bad_alloc geworfen.

Mögliche Implementierung

copy (1)
template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last,
              OutputIt d_first)
{
    for (; first != last; (void)++first, (void)++d_first)
        *d_first = *first;
    return d_first;
}
copy_if (3)
template<class InputIt, class OutputIt, class UnaryPred>
OutputIt copy_if(InputIt first, InputIt last,
                 OutputIt d_first, UnaryPred pred)
{
    for (; first != last; ++first)
        if (pred(*first))
        {
            *d_first = *first;
            ++d_first;
        }
    return d_first;
}

Hinweise

In der Praxis vermeiden Implementierungen von std::copy mehrfache Zuweisungen und verwenden Massenkopierfunktionen wie std::memmove , wenn der Werttyp TriviallyCopyable ist und die Iteratortypen LegacyContiguousIterator erfüllen.

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

Beispiel

Der folgende Code verwendet std::copy sowohl zum Kopieren der Inhalte eines std::vector in einen anderen als auch zum Anzeigen des resultierenden std::vector .

#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
int main()
{
    std::vector<int> from_vector(10);
    std::iota(from_vector.begin(), from_vector.end(), 0);    
    std::vector<int> to_vector;
    std::copy(from_vector.begin(), from_vector.end(), std::back_inserter(to_vector));
// or, alternatively,
//  std::vector<int> to_vector(from_vector.size());
//  std::copy(from_vector.begin(), from_vector.end(), to_vector.begin());
// either way is equivalent to
//  std::vector<int> to_vector = from_vector;
    std::cout << "to_vector contains: ";
    std::copy(to_vector.begin(), to_vector.end(),
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
    std::cout << "odd numbers in to_vector are: ";
    std::copy_if(to_vector.begin(), to_vector.end(),
                 std::ostream_iterator<int>(std::cout, " "),
                 [](int x) { return x % 2 != 0; });
    std::cout << '\n';
    std::cout << "to_vector contains these multiples of 3: ";
    to_vector.clear();
    std::copy_if(from_vector.begin(), from_vector.end(),
                 std::back_inserter(to_vector),
                 [](int x) { return x % 3 == 0; });
    for (const int x : to_vector)
        std::cout << x << ' ';
    std::cout << '\n';
}

Mögliche Ausgabe:

to_vector contains: 0 1 2 3 4 5 6 7 8 9
odd numbers in to_vector are: 1 3 5 7 9
to_vector contains these multiples of 3: 0 3 6 9

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2039 C++11 der Rückgabewert von std::copy_if war nicht spezifiziert spezifiziert
LWG 2044 C++11 die Stabilität von std::copy_if war nicht definiert definiert

Siehe auch

kopiert eine Reihe von Elementen in umgekehrter Reihenfolge
(Funktions-Template)
erstellt eine Kopie eines Bereichs, der umgekehrt ist
(Funktions-Template)
(C++11)
kopiert eine Anzahl von Elementen an einen neuen Speicherort
(Funktions-Template)
weist jedem Element in einem Bereich den gegebenen Wert zu
(Funktions-Template)
kopiert eine Reihe von Elementen unter Auslassung derjenigen, die bestimmte Kriterien erfüllen
(Funktions-Template)
kopiert eine Reihe von Elementen an einen neuen Speicherort
(Algorithmus-Funktionsobjekt)