std::swap_ranges în C++

Schimbă între ele elementele a două intervale de aceeași lungime, poziție cu poziție.

Sintaxă
ForwardIt2 swap_ranges(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2);

Ce face std::swap_ranges

std::swap_ranges face swap între first1[i] și first2[i] pentru fiecare poziție din primul interval. Al doilea interval trebuie să aibă cel puțin la fel de multe elemente.

Este util pentru a schimba bucăți din containere diferite sau două jumătăți ale aceluiași container. Pentru a schimba două containere întregi, std::swap(a, b) sau a.swap(b) este mai rapid.

Parametri

Parametru Descriere
first1, last1 Primul interval.
first2 Începutul celui de-al doilea interval.

Ce returnează

Iterator după ultimul element schimbat din al doilea interval.

Exemple

Exemplul 1: Schimbarea primelor două echipe

#include <algorithm>
#include <print>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> echipa_a{"Ana", "Bogdan", "Cristi"};
    std::vector<std::string> echipa_b{"Dana", "Emil", "Flavia"};

    std::swap_ranges(echipa_a.begin(), echipa_a.begin() + 2, echipa_b.begin());

    std::println("A: {}", echipa_a);
    std::println("B: {}", echipa_b);
}

Rezultat

A: ["Dana", "Emil", "Cristi"]
B: ["Ana", "Bogdan", "Flavia"]

Exemplul 2: Jumătățile unui vector

#include <algorithm>
#include <print>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 3, 10, 20, 30};
    auto mijloc = v.begin() + 3;

    std::swap_ranges(v.begin(), mijloc, mijloc);
    std::println("{}", v);
}

Rezultat

[10, 20, 30, 1, 2, 3]

Greșeli frecvente

  • Al doilea interval este mai scurt decât primul: funcția scrie în afara lui (comportament nedefinit).

Comenzi înrudite

  • std::rotate: Rotește elementele astfel încât middle devine primul element, iar cele dinaintea lui trec la final.
  • std::move: Mută elementele unui interval la o destinație, fără să le copieze (versiunea din <algorithm>).
  • std::reverse: Inversează pe loc ordinea elementelor dintr-un interval.