std::iter_swap
Von cppreference.com
| Definiert in Header <algorithm> |
||
| template< class ForwardIt1, class ForwardIt2 > void iter_swap( ForwardIt1 a, ForwardIt2 b ); |
(constexpr seit C++20) | |
Vertauscht die Werte der Elemente, auf die die gegebenen Iteratoren zeigen.
Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert
- a oder b ist nicht dereferenzierbar.
- *a ist nicht vertauschbar mit *b.
Inhalt |
[bearbeiten] Parameter
| a, b | - | Iteratoren zu den zu vertauschenden Elementen |
| Typanforderungen | ||
-ForwardIt1, ForwardIt2 müssen die Anforderungen an LegacyForwardIterator erfüllen. | ||
[bearbeiten] Rückgabewert
(keine)
[bearbeiten] Komplexität
Konstant.
[bearbeiten] Hinweise
Diese Funktion schablone modelliert die Semantik der durch Swappable gegebenen Vertauschungsoperation. Das heißt, Überladungen von swap, die durch ADL gefunden werden, und der Fallback von std::swap werden berücksichtigt.
[bearbeiten] Mögliche Implementierung
template<class ForwardIt1, class ForwardIt2> constexpr //< since C++20 void iter_swap(ForwardIt1 a, ForwardIt2 b) { using std::swap; swap(*a, *b); } |
[bearbeiten] Beispiel
Das Folgende ist eine Implementierung des Auswahl-Sortieralgorithmus in C++.
Führen Sie diesen Code aus
#include <algorithm> #include <iostream> #include <random> #include <string_view> #include <vector> template<class ForwardIt> void selection_sort(ForwardIt begin, ForwardIt end) { for (ForwardIt it = begin; it != end; ++it) std::iter_swap(it, std::min_element(it, end)); } void println(std::string_view rem, std::vector<int> const& v) { std::cout << rem; for (int e : v) std::cout << e << ' '; std::cout << '\n'; } template<int min, int max> int rand_int() { static std::uniform_int_distribution dist(min, max); static std::mt19937 gen(std::random_device{}()); return dist(gen); } int main() { std::vector<int> v; std::generate_n(std::back_inserter(v), 20, rand_int<-9, +9>); std::cout << std::showpos; println("Before sort: ", v); selection_sort(v.begin(), v.end()); println("After sort: ", v); }
Mögliche Ausgabe
Before sort: -9 -3 +2 -8 +0 -1 +8 -4 -5 +1 -4 -5 +4 -9 -8 -6 -6 +8 -4 -6 After sort: -9 -9 -8 -8 -6 -6 -6 -5 -5 -4 -4 -4 -3 -1 +0 +1 +2 +4 +8 +8
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 187 | C++98 | Es war nicht spezifiziert, ob swap verwendet wird. | Die Auswirkung ist äquivalent zu swap(*a, *b). |
[bearbeiten] Siehe auch
| tauscht die Werte von zwei Objekten (Funktionsvorlage) | |
| Tauscht zwei Elementbereiche (Funktionstempelat) | |
| (C++20) |
tauscht die Objekte, auf die von zwei angepassten zugrunde liegenden Iteratoren gezeigt wird (Funktionstemplate) |
| (C++20) |
tauscht die Objekte, auf die zwei zugrundeliegende Iteratoren zeigen (Funktionstemplate) |
| (C++20) |
tauscht die von zwei dereferenzierbaren Objekten referenzierten Werte (Customization-Punkt-Objekt) |