Namespaces
Variants

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

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
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 ) , wobei M = ranges:: min ( ranges:: distance ( first1, last1 ) , ranges:: distance ( first2, last2 ) ) .
Die Bereiche [ first1 , last1 ) und [ first2 , last2 ) dürfen sich nicht überlappen.
2) Gleich 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ürde.

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithm Function Objects (informell bekannt als Niebloids ), das heißt:

Inhaltsverzeichnis

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)