std::swap_ranges
| Definiert in 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 anderen Bereich mit std::distance(first1, last1) Elementen beginnend bei first2.|
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 von korrespondierenden Iteratoren iter1 und iter2 in den beiden Bereichen, sodass *iter1 nicht Swappable mit *iter2 ist.
Inhalt |
[edit] 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 Ausführungsrichtlinie, die verwendet werden soll |
| Typanforderungen | ||
-ForwardIt1, ForwardIt2 müssen die Anforderungen an LegacyForwardIterator erfüllen. | ||
[edit] Rückgabewert
Iterator auf das Element nach dem letzten getauschten Element im Bereich beginnend bei first2.
[edit] Komplexität
Genau std::distance(first1, last1) Tauschoperationen.
[edit] 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.
[edit] Hinweise
Implementierungen (z.B. MSVC STL) können Vektorisierung aktivieren, wenn der Iteratortyp LegacyContiguousIterator erfüllt und das Vertauschen seines Wertetyps weder eine nicht-triviale spezielle Member-Funktion noch eine über ADL gefundene swap-Funktion aufruft.
[edit] Mögliche Implementierung
template<class ForwardIt1, class ForwardIt2> constexpr //< since C++20 ForwardIt2 swap_ranges(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2) { for (; first1 != last1; ++first1, ++first2) std::iter_swap(first1, first2); return first2; } |
[edit] Beispiel
Demonstriert das Tauschen 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
[edit] Siehe auch
| Tauscht die Elemente, auf die zwei Iteratoren zeigen (Funktionstempelat) | |
| tauscht die Werte von zwei Objekten (Funktionsvorlage) | |
| (C++20) |
Tauscht zwei Elementbereiche (Algorithmus-Funktionsobjekt) |