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

std::rotate_copy

#include <algorithm>

template <class ForwardIterator, class OutputIterator>
OutputIterator rotate_copy (ForwardIterator first, ForwardIterator middle,
ForwardIterator last, OutputIterator result);

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. Phạm vi nguồn không bị thay đổi.

Tham số

first

  • Forward Iterator trỏ đến phần tử đầu tiên trong phạm vi nguồn cần sao chép và xoay.

middle

  • Forward Iterator trỏ đến phần tử trong phạm vi nguồn mà sẽ trở thành phần tử đầu tiên sau khi xoay trong phạm vi đích.

last

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

result

  • Output Iterator trỏ đến phần tử đầu tiên trong phạm vi đích nơi các phần tử sẽ được sao chép đến.

Giá trị trả về

  • Output Iterator trỏ đến phần tử ngay sau phần tử cuối cùng được sao chép trong phạm vi đích.

Đặc điểm

  1. Phạm vi nguồn [first, last) là "nửa mở", không bao gồm phần tử last.
  2. Phạm vi đích phải có đủ không gian để chứa các phần tử được sao chép. Sử dụng std::back_inserter là một cách an toàn khi sao chép vào container có thể thay đổi kích thước như std::vector.
  3. rotate_copy() không thay đổi phạm vi nguồn.
  4. rotate_copy() trả về iterator trỏ đến sau phần tử cuối cùng được sao chép trong phạm vi đích.
  5. rotate_copy() yêu cầu Forward Iterator cho phạm vi nguồn và Output Iterator cho phạm vi đích.
  6. 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 trong quá trình sao chép và xoay.
  7. rotate_copy() thường được sử dụng để:
    • Tạo một bản sao của một container với các phần tử được xoay.
    • Sao chép và xoay dữ liệu từ nguồn sang đích mà không làm thay đổi dữ liệu nguồn.
    • Kết hợp việc sao chép và xoay dữ liệu trong một bước duy nhất.
Phân biệt với rotate()
  • rotate() xoay các phần tử tại chỗ (trong phạm vi gốc).
  • rotate_copy() tạo ra một bản sao của phạm vi với các phần tử được xoay, giữ nguyên phạm vi gốc.

Ví dụ

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

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

// Sao chép và xoay source sang destination, để 4 trở thành phần tử đầu tiên
std::rotate_copy(source.begin(), source.begin() + 3, source.end(), destination.begin());

std::cout << "destination after rotate_copy: ";
for (int x : destination) {
std::cout << x << " ";
}
std::cout << std::endl;

std::cout << "source after rotate_copy (unchanged): ";
for (int x : source) {
std::cout << x << " ";
}
std::cout << std::endl;

std::string str = "abcdefgh";
std::string resultStr;

// Sao chép và xoay str sang resultStr, để 'f' trở thành ký tự đầu tiên
std::rotate_copy(str.begin(), str.begin() + 5, str.end(), std::back_inserter(resultStr));

std::cout << "resultStr after rotate_copy: " << resultStr << std::endl;

return 0;
}

Các hàm liên quan

rotateXoay (rotate) các phần tử trong một phạm vi (range) sang trái
reverse_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 theo thứ tự đảo ngược
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
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