std:: swap_ranges
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
ForwardIt1,
class
ForwardIt2
>
ForwardIt2 swap_ranges
(
ForwardIt1 first1, ForwardIt1 last1,
|
(1) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
|
(2) | (seit C++17) |
[
first1
,
last1
)
und einem weiteren Bereich von
std::
distance
(
first1, last1
)
Elementen beginnend bei
first2
aus.
|
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 eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:
- Die beiden Bereiche überlappen sich.
- Es existiert ein Paar entsprechender Iteratoren iter1 und iter2 in den beiden Bereichen, sodass * iter1 nicht Swappable mit * iter2 ist.
Inhaltsverzeichnis |
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) |