std::copy_n
Von cppreference.com
| Definiert in Header <algorithm> |
||
| template< class InputIt, class Size, class OutputIt > OutputIt copy_n( InputIt first, Size count, OutputIt result ); |
(1) | (seit C++11) (constexpr seit C++20) |
| template< class ExecutionPolicy, class ForwardIt1, class Size, class ForwardIt2 > |
(2) | (seit C++17) |
1) Kopiert exakt count Werte aus dem Bereich, der bei first beginnt, in den Bereich, der bei result beginnt. Formell wird für jede ganze Zahl i in
[0, count) *(result + i) = *(first + i) ausgeführt. Überlappung von Bereichen ist formell gestattet, führt aber zu unvorhersehbarer Reihenfolge der Ergebnisse.
2) Wie (1), wird aber gemäß policy ausgeführt.
Diese Überladung nimmt an der Überladungsauflösung teil, nur 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) |
Inhalt |
[bearbeiten] Parameter
| first | - | Der Anfang des zu kopierenden Bereichs von Elementen |
| zählt | - | Anzahl der zu kopierenden Elemente |
| Ergebnis | - | der Anfang des Zielbereichs |
| policy | - | die Ausführungsrichtlinie, die verwendet werden soll |
| Typanforderungen | ||
-InputIt muss die Anforderungen von LegacyInputIterator erfüllen. | ||
-OutputIt muss die Anforderungen an LegacyOutputIterator erfüllen. | ||
-ForwardIt1, ForwardIt2 müssen die Anforderungen an LegacyForwardIterator erfüllen. | ||
[bearbeiten] Rückgabewert
Iterator im Zielbereich, der auf das letzte kopierte Element zeigt, wenn count > 0, andernfalls result.
[bearbeiten] Komplexität
Null Zuweisungen, wenn count < 0; andernfalls count Zuweisungen.
[bearbeiten] Ausnahmen
Die Überladung mit einem Template-Parameter namens ExecutionPolicy meldet Fehler wie folgt
- Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsabhängig. - Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.
[bearbeiten] Mögliche Implementierung
template<class InputIt, class Size, class OutputIt> constexpr //< since C++20 OutputIt copy_n(InputIt first, Size count, OutputIt result) { if (count > 0) { *result = *first; ++result; for (Size i = 1; i != count; ++i, (void)++result) *result = *++first; } return result; } |
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <algorithm> #include <iostream> #include <iterator> #include <numeric> #include <string> #include <vector> int main() { std::string in {"1234567890"}; std::string out; std::copy_n(in.begin(), 4, std::back_inserter(out)); std::cout << out << '\n'; std::vector<int> v_in(128); std::iota(v_in.begin(), v_in.end(), 1); std::vector<int> v_out(v_in.size()); std::copy_n(v_in.cbegin(), 100, v_out.begin()); std::cout << std::accumulate(v_out.begin(), v_out.end(), 0) << '\n'; }
Ausgabe
1234 5050
[bearbeiten] Siehe auch
| (C++11) |
Kopiert einen Elementbereich an einen neuen Speicherort (Funktionstempelat) |
| (C++20) |
Kopiert eine Anzahl von Elementen an einen neuen Speicherort (Algorithmus-Funktionsobjekt) |