Chuyển tới nội dung chính

std::rotate

#include <algorithm>

template <class ForwardIterator>
ForwardIterator rotate (ForwardIterator first, ForwardIterator middle,
ForwardIterator last);

Xoay (rotate) các phần tử trong một phạm vi (range) sang trái. Điều này có nghĩa là, nó di chuyển một số phần tử từ đầu phạm vi xuống cuối phạm vi, và dịch chuyển các phần tử còn lại lên đầu.

Tham số

first

  • Forward Iterator trỏ đến phần tử đầu tiên trong phạm vi cần xoay.

middle

  • Forward Iterator trỏ đến phần tử sẽ trở thành phần tử đầu tiên sau khi xoay.

last

  • Forward Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi cần xoay. Phạm vi là [first, last).

Giá trị trả về

  • Forward Iterator trỏ đến vị trí mới của phần tử mà ban đầu là phần tử đầu tiên (tức là vị trí của first sau khi xoay).

Đặc điểm

  1. Phạm vi [first, last) là "nửa mở", không bao gồm phần tử last.
  2. rotate() thay đổi trực tiếp thứ tự các phần tử trong phạm vi gốc, không tạo ra một phạm vi mới.
  3. rotate() yêu cầu Forward Iterator, cho phép di chuyển một chiều về phía trước.
  4. Thứ tự tương đối của các phần tử trong mỗi phần (trước và sau middle) được giữ nguyên.
  5. middle có thể bằng first hoặc last, trong trường hợp đó rotate() sẽ không làm thay đổi phạm vi.

Ví dụ

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8};

// Xoay các phần tử trong numbers để 4 trở thành phần tử đầu tiên
auto it = std::rotate(numbers.begin(), numbers.begin() + 3, numbers.end());

std::cout << "numbers after rotate: ";
for (int x : numbers) {
std::cout << x << " ";
}
std::cout << std::endl;
std::cout << "New position of the first element: " << (it - numbers.begin()) << std::endl;

std::vector<int> numbers2 = {1, 2, 3, 4, 5, 6, 7, 8};
// Xoay các phần tử trong numbers2 để 6 trở thành phần tử đầu tiên
auto it2 = std::rotate(numbers2.begin(), numbers2.begin() + 5, numbers2.end());

std::cout << "numbers2 after rotate: ";
for (int x : numbers2) {
std::cout << x << " ";
}
std::cout << std::endl;
std::cout << "New position of the first element: " << (it2 - numbers2.begin()) << std::endl;

return 0;
}

Các hàm liên quan

rotate_copySao chép các phần tử từ một phạm vi (range) nguồn sang một phạm vi đích khác, đồng thời xoay (rotate) các phần tử trong quá trình sao chép
reverseĐảo ngược thứ tự các phần tử trong một phạm vi (range) được chỉ định
random_shuffleXáo trộn (shuffle) ngẫu nhiên các phần tử trong một phạm vi (range) được chỉ định
swapHoán đổi giá trị của hai đối tượng