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
middlecare nu se află întrefirstșilast(de exemplu pentru o rotire cu mai multe poziții decât elemente). Foloseștek % 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.