std::copy_n
Von de.cppreference.net
| 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 >
ForwardIt2 copy_n( ExecutionPolicy&& policy,
ForwardIt1 first, Size count, ForwardIt2 result );
|
(2) | (seit C++17) |
1) Kopiert genau
count Werte aus dem Bereich, der bei first beginnt, in den Bereich, der bei result beginnt. Formal führt es für jede ganze Zahl i in [0, count) *(result + i) = *(first + i) aus. Überlappung von Bereichen ist formal erlaubt, führt aber zu unvorhersehbarer Reihenfolge der Ergebnisse.
2) Wie (1), aber ausgeführt gemäß
policy. Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn der Wert des folgenden Ausdrucks
true ist:
|
|
(bis C++20) |
|
|
(seit C++20) |
Parameter
| first | - | der Beginn des Bereichs der zu kopierenden Elemente |
| count | - | Anzahl der zu kopierenden Elemente |
| result | - | der Beginn des Zielbereichs |
| policy | - | die Ausführungsrichtlinie die verwendet werden soll |
| 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.
| ||
Rückgabewert
Iterator im Zielbereich, der auf das Element nach dem letzten kopierten zeigt, wenn count > 0, oder result sonst.
Komplexität
Null Zuweisungen, wenn count < 0; count Zuweisungen sonst.
Ausnahmen
Die Überladung mit einem Vorlagenparameter 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 implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc ausgelöst.
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;
}
|
Beispiel
Diesen Code ausführen
#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
Siehe auch
(C++11) |
kopiert einen Bereich von Elementen an eine neue Stelle (Funktionsschablone & Algorithmus-Funktionsobjekt) |
(C++20)(C++20) |
|
(C++20) |
kopiert eine Anzahl von Elementen an eine neue Stelle (Algorithmus-Funktionsobjekt) |