std::rotate în C++

Rotește elementele astfel încât middle devine primul element, iar cele dinaintea lui trec la final.

Sintaxă
ForwardIt rotate(ForwardIt first, ForwardIt middle, ForwardIt last);

Ce face std::rotate

std::rotate mută blocul [middle, last) la început și blocul [first, middle) la final, păstrând ordinea din fiecare bloc. Este o rotire spre stânga cu middle - first poziții.

Pentru rotire spre dreapta cu k poziții, folosește middle = end() - k. Din C++11, funcția returnează noua poziție a elementului care era primul.

Parametri

Parametru Descriere
first, last Intervalul.
middle Elementul care va deveni primul.

Ce returnează

Iterator către poziția nouă a fostului *first (C++11).

Exemple

Exemplul 1: Rotire la stânga și la dreapta

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

int main() {
    std::vector<int> v{1, 2, 3, 4, 5};

    std::rotate(v.begin(), v.begin() + 2, v.end());
    std::println("Stânga cu 2:  {}", v);

    std::rotate(v.begin(), v.end() - 1, v.end());
    std::println("Dreapta cu 1: {}", v);
}

Rezultat

Stânga cu 2:  [3, 4, 5, 1, 2]
Dreapta cu 1: [2, 3, 4, 5, 1]

Exemplul 2: Ture de gardă

Primul de pe listă trece la final după fiecare zi.

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

int main() {
    std::vector<std::string> garda{"Ana", "Bogdan", "Cristi"};

    for (int zi = 1; zi <= 4; ++zi) {
        std::println("Ziua {}: {}", zi, garda.front());
        std::ranges::rotate(garda, garda.begin() + 1);
    }
}

Rezultat

Ziua 1: Ana
Ziua 2: Bogdan
Ziua 3: Cristi
Ziua 4: Ana

Greșeli frecvente

  • Dai un middle care nu se află între first și last (de exemplu pentru o rotire cu mai multe poziții decât elemente). Folosește k % v.size().

Comenzi înrudite

  • std::reverse: Inversează pe loc ordinea elementelor dintr-un interval.
  • std::shuffle: Amestecă aleatoriu elementele unui interval folosind un generator de numere aleatorii.
  • std::swap_ranges: Schimbă între ele elementele a două intervale de aceeași lungime, poziție cu poziție.