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
- Phạm vi
[first, last)
là "nửa mở", không bao gồm phần tửlast
. 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.rotate()
yêu cầu Forward Iterator, cho phép di chuyển một chiều về phía trước.- 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.
middle
có thể bằngfirst
hoặclast
, 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_copy | Sao 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_shuffle | Xáo trộn (shuffle) ngẫu nhiên các phần tử trong một phạm vi (range) được chỉ định |
swap | Hoán đổi giá trị của hai đối tượng |