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

std::reverse_copy

#include <algorithm>

template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy (BidirectionalIterator first, BidirectionalIterator 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 theo thứ tự đảo ngược.

Tham số

first

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

last

  • Bidirectional 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 theo thứ tự đảo ngược.

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. reverse_copy() không thay đổi phạm vi nguồn.
  4. reverse_copy() trả về iterator trỏ đến sau phần tử cuối cùng được sao chép trong phạm vi đích.
  5. reverse_copy() yêu cầu Bidirectional Iterator cho phạm vi nguồn (để duyệt ngược) và Output Iterator cho phạm vi đích (để ghi).
  6. reverse_copy() thường được sử dụng để:
    • Tạo một bản sao của một container với thứ tự các phần tử được đảo ngược.
    • Sao chép dữ liệu từ nguồn sang đích theo thứ tự ngược lại mà không làm thay đổi dữ liệu nguồn.
    • Kết hợp việc sao chép và đảo ngược thứ tự trong một bước duy nhất.
Phân biệt với reverse()
  • reverse() đảo ngược thứ tự các phần tử tại chỗ (trong phạm vi gốc).
  • reverse_copy() tạo ra một bản sao của phạm vi với thứ tự các phần tử được đảo ngược, 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};
std::vector<int> destination;

// Sao chép source sang destination theo thứ tự đảo ngược
std::reverse_copy(source.begin(), source.end(), std::back_inserter(destination));

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

std::string str = "hello";
std::string reversedStr;

// Sao chép str sang reversedStr theo thứ tự đảo ngược
std::reverse_copy(str.begin(), str.end(), std::back_inserter(reversedStr));

std::cout << "reversedStr after reverse_copy: " << reversedStr << std::endl;

return 0;
}

Các hàm liên quan

reverseĐảo ngược thứ tự các phần tử trong một phạm vi (range) được chỉ định
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
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
copy_backwardSao 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, bắt đầu từ cuối của cả hai phạm vi và di chuyển ngược về phía đầu
swapHoán đổi giá trị của hai đối tượng