Namespaces
Variants

std::ranges::swap_ranges, std::ranges::swap_ranges_result

Von de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Stapeloperationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Austauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum-/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Eingeschränkte Algorithmen
Alle Namen in diesem Menü gehören zum Namespace std::ranges
Nicht modifizierende Sequenzoperationen
Modifizierende Sequenzoperationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen (auf sortierten Bereichen)
       
       
Mengenoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum-/Maximum-Operationen
       
       
Permutationsoperationen
Faltungsoperationen
Operationen auf nicht initialisiertem Speicher
Rückgabetypen
 
Definiert in Header <algorithm>
Aufrufsignatur
template< std::input_iterator I1, std::sentinel_for<I1> S1,
          std::input_iterator I2, std::sentinel_for<I2> S2 >
requires std::indirectly_swappable<I1, I2>
constexpr swap_ranges_result<I1, I2>
    swap_ranges( I1 first1, S1 last1, I2 first2, S2 last2 );
(1) (seit C++20)
template< ranges::input_range R1, ranges::input_range R2 >
requires std::indirectly_swappable<ranges::iterator_t<R1>, ranges::iterator_t<R2>>
constexpr swap_ranges_result<ranges::borrowed_iterator_t<R1>,
                             ranges::borrowed_iterator_t<R2>>
    swap_ranges( R1&& r1, R2&& r2 );
(2) (seit C++20)
Hilfstypen
template< class I1, class I2 >
using swap_ranges_result = ranges::in_in_result<I1, I2>;
(3) (seit C++20)
1) Tauscht Elemente zwischen dem ersten Bereich [first1, first1 + M) und dem zweiten Bereich [first2, first2 + M) mittels ranges::iter_swap(first1 + i, first2 + i) aus, wobei M = ranges::min(ranges::distance(first1, last1), ranges::distance(first2, last2)) gilt.
Die Bereiche [first1, last1) und [first2, last2) dürfen sich nicht überlappen.
2) Wie (1), verwendet jedoch r1 als ersten Bereich und r2 als zweiten Bereich, als ob ranges::begin(r1) als first1, ranges::end(r1) als last1, ranges::begin(r2) als first2 und ranges::end(r2) als last2 verwendet würden.

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als Niebloids bekannt), das heißt:

Parameter

first1, last1 - das Iterator-Sentinel-Paar, das den ersten Bereich der zu tauschenden Elemente definiert
first2, last2 - das Iterator-Sentinel-Paar, das den zweiten Bereich der zu tauschenden Elemente definiert
r1 - der erste Bereich der zu tauschenden Elemente
r2 - der zweite Bereich der zu tauschenden Elemente

Rückgabewert

{ first1 + M, first2 + M } .

Komplexität

Genau M Vertauschungen.

Hinweise

Implementierungen (z.B. MSVC STL ) können Vektorisierung ermöglichen, wenn der Iteratortyp contiguous_iterator modelliert und das Vertauschen seines Werttyps weder nicht-triviale spezielle Memberfunktionen noch ADL -gefundene swap -Funktionen aufruft.

Mögliche Implementierung

struct swap_ranges_fn
{
    template<std::input_iterator I1, std::sentinel_for<I1> S1,
             std::input_iterator I2, std::sentinel_for<I2> S2>
    requires std::indirectly_swappable<I1, I2>
    constexpr ranges::swap_ranges_result<I1, I2>
        operator()(I1 first1, S1 last1, I2 first2, S2 last2) const
    {
        for (; !(first1 == last1 or first2 == last2); ++first1, ++first2)
            ranges::iter_swap(first1, first2);
        return {std::move(first1), std::move(first2)};
    }
    template<ranges::input_range R1, ranges::input_range R2>
    requires std::indirectly_swappable<ranges::iterator_t<R1>, ranges::iterator_t<R2>>
    constexpr ranges::swap_ranges_result<ranges::borrowed_iterator_t<R1>,
                                         ranges::borrowed_iterator_t<R2>>
        operator()(R1&& r1, R2&& r2) const
    {
        return (*this)(ranges::begin(r1), ranges::end(r1),
                       ranges::begin(r2), ranges::end(r2));
    }
};
inline constexpr swap_ranges_fn swap_ranges {};
**Anmerkung:** Da der gesamte Inhalt innerhalb der `
`-Tags C++-Code ist und gemäß den Anweisungen nicht übersetzt werden soll, wurde nur die strukturelle Übersetzung der HTML-Tabelle durchgeführt. Der C++-Code selbst bleibt vollständig unverändert, einschließlich aller Schlüsselwörter, Typnamen und Bezeichner.

Beispiel

#include <algorithm>
#include <iostream>
#include <list>
#include <string_view>
#include <vector>
auto print(std::string_view name, auto const& seq, std::string_view term = "\n")
{
    std::cout << name << " : ";
    for (const auto& elem : seq)
        std::cout << elem << ' ';
    std::cout << term;
}
int main()
{
    std::vector<char> p {'A', 'B', 'C', 'D', 'E'};
    std::list<char> q {'1', '2', '3', '4', '5', '6'};
    print("p", p);
    print("q", q, "\n\n");
    // swap p[0, 2) and q[1, 3):
    std::ranges::swap_ranges(p.begin(),
                             p.begin() + 4,
                             std::ranges::next(q.begin(), 1),
                             std::ranges::next(q.begin(), 3));
    print("p", p);
    print("q", q, "\n\n");
    // swap p[0, 5) and q[0, 5):
    std::ranges::swap_ranges(p, q);
    print("p", p);
    print("q", q);
}

Ausgabe:

p : A B C D E
q : 1 2 3 4 5 6
p : 2 3 C D E
q : 1 A B 4 5 6
p : 1 A B 4 5
q : 2 3 C D E 6

Siehe auch

(C++20)
vertauscht die Werte, auf die zwei dereferenzierbare Objekte verweisen
(Anpassungspunktobjekt)
vertauscht die Werte zweier Objekte
(Anpassungspunktobjekt)
vertauscht zwei Bereiche von Elementen
(Funktionstemplate)
vertauscht die Elemente, auf die zwei Iteratoren zeigen
(Funktionstemplate)
vertauscht die Werte zweier Objekte
(Funktionstemplate)