std::swap_ranges
| Definiert in Header <algorithm>
|
||
template< class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2 );
|
(1) | (constexpr seit C++20) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2 );
|
(2) | (seit C++17) |
[first1, last1) und einem anderen Bereich von std::distance(first1, last1) Elementen ab first2 aus.policy ausgeführt.true ist:
|
|
(bis C++20) |
|
|
(seit C++20) |
Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:
- Die beiden Bereiche überlappen sich.
- Es gibt ein Paar korrespondierender Iteratoren
iter1unditer2in den beiden Bereichen, so dass*iter1nicht Swappable mit*iter2ist.
Parameter
| first1, last1 | - | das Paar von Iteratoren, das den Bereich der zu tauschenden Elemente definiert |
| first2 | - | Anfang des zweiten Bereichs der zu tauschenden Elemente |
| policy | - | die zu verwendende Ausführungsrichtlinie |
| Typanforderungen | ||
-
ForwardIt1, ForwardIt2
müssen die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
Rückgabewert
Iterator auf das Element nach dem letzten ausgetauschten Element im Bereich beginnend mit first2 .
Komplexität
Genau std:: distance ( first1, last1 ) Vertauschungen.
Exceptions
Die Überladung mit einem Template-Parameter namens
ExecutionPolicy
meldet Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allokieren kann, wird std::bad_alloc geworfen.
Hinweise
Implementierungen (z.B.
MSVC STL
) können Vektorisierung ermöglichen, wenn der Iteratortyp
LegacyContiguousIterator
erfüllt und das Austauschen seines Werttyps weder nicht-triviale spezielle Memberfunktionen noch
ADL
-gefundene
swap
-Funktionen aufruft.
Mögliche Implementierung
template<class ForwardIt1, class ForwardIt2> constexpr //< seit C++20 ForwardIt2 swap_ranges(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2) { for (; first1 != last1; ++first1, ++first2) std::iter_swap(first1, first2); return first2; } |
Beispiel
Demonstriert das Austauschen von Teilbereichen aus verschiedenen Containern.
#include <algorithm> #include <iostream> #include <list> #include <vector> auto print = [](auto comment, auto const& seq) { std::cout << comment; for (const auto& e : seq) std::cout << e << ' '; std::cout << '\n'; }; int main() { std::vector<char> v{'a', 'b', 'c', 'd', 'e'}; std::list<char> l{'1', '2', '3', '4', '5'}; print("Before swap_ranges:\n" "v: ", v); print("l: ", l); std::swap_ranges(v.begin(), v.begin() + 3, l.begin()); print("After swap_ranges:\n" "v: ", v); print("l: ", l); }
Ausgabe:
Before swap_ranges: v: a b c d e l: 1 2 3 4 5 After swap_ranges: v: 1 2 3 d e l: a b c 4 5
Siehe auch
|
tauscht die Elemente aus, auf die zwei Iteratoren zeigen
(Funktions-Template) |
|
|
tauscht die Werte zweier Objekte
(Funktions-Template) |
|
|
(C++20)
|
tauscht zwei Bereiche von Elementen
(Algorithmus-Funktionsobjekt) |