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

std::copy

#include <algorithm>

template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator 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.

Tham số

first

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

last

  • Input 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. Nói cách khác, nó trỏ đến vị trí sau phần tử cuối cùng đã ghi 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. Nếu không, hành vi sẽ không xác định (có thể dẫn đến lỗi hoặc ghi đè dữ liệu). Sử dụng std::back_inserter là một cách an toàn để tránh vấn đề này khi sao chép vào container có thể thay đổi kích thước như std::vector.
  3. copy() ghi đè các phần tử hiện có trong phạm vi đích.
  4. copy() trả về iterator trỏ đến sau phần tử cuối cùng được sao chép trong phạm vi đích. Điều này hữu ích khi bạn muốn tiếp tục sao chép hoặc thực hiện các thao tác khác vào vị trí tiếp theo trong phạm vi đích.
  5. copy() thường được sử dụng để:
    • Sao chép dữ liệu từ một container sang một container khác.
    • Tạo một bản sao của một phần của container.
    • Sao chép dữ liệu từ container sang mảng (C-style array) hoặc ngược lại.
    • Kết hợp với các iterator khác như std::back_inserter để thêm các phần tử vào cuối container.

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(5); // Vector đích có kích thước bằng vector nguồn

// Sao chép từ source sang destination
std::copy(source.begin(), source.end(), destination.begin());

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

std::vector<int> anotherDestination; // Vector đích rỗng

// Sử dụng back_inserter để thêm các phần tử vào cuối vector đích
std::copy(source.begin(), source.end(), std::back_inserter(anotherDestination));

std::cout << "anotherDestination after copy: ";
for (int x : anotherDestination) {
std::cout << x << " ";
}
std::cout << std::endl;

int arr[5]; // Mảng C-style

// Sao chép từ source sang mảng
std::copy(source.begin(), source.end(), arr);

std::cout << "arr after copy: ";
for (int i = 0; i < 5; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;

return 0;
}

Các hàm liên quan

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
fillGán một giá trị cho tất cả các phần tử trong một phạm vi (range) được chỉ định
replaceThay thế tất cả các lần xuất hiện của một giá trị cũ bằng một giá trị mới trong một phạm vi (range)