std::copy_n
#include <algorithm>
template <class InputIterator, class Size, class OutputIterator>
OutputIterator copy_n (InputIterator first, Size n, OutputIterator result);
Sao chép n
phần tử từ một phạm vi (range) nguồn sang một phạm vi đích khác. Nó tương tự như copy()
, nhưng thay vì sao chép toàn bộ phạm vi, nó chỉ sao chép một số lượng phần tử nhất định.
Tham số
first
- Input Iterator trỏ đến phần tử đầu tiên trong phạm vi nguồn cần sao chép.
n
- Số lượng phần tử cần sao chép.
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
n
phải là một số nguyên không âm. Nếun
lớn hơn số phần tử còn lại trong phạm vi nguồn (tính từ first),copy_n()
sẽ sao chép tất cả các phần tử còn lại đó.- Phạm vi đích phải có đủ không gian để chứa
n
phần tử. Nếu không, hành vi sẽ không xác định. 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. copy_n()
ghi đè các phần tử hiện có trong phạm vi đích.copy_n()
trả về iterator trỏ đến sau phần tử cuối cùng được sao chép trong phạm vi đích.copy_n()
thường được sử dụng khi bạn chỉ muốn sao chép một số lượng phần tử nhất định từ nguồn sang đích, ví dụ:- Sao chép một phần đầu của một container.
- Sao chép một số lượng ký tự nhất định từ một chuỗi.
- Giới hạn số lượng bản ghi được sao chép từ một tệp.
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main() {
std::vector<int> source = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> destination(5); // Vector đích có kích thước là 5
// Sao chép 5 phần tử đầu tiên từ source sang destination
std::copy_n(source.begin(), 5, destination.begin());
std::cout << "destination after copy_n: ";
for (int x : destination) {
std::cout << x << " ";
}
std::cout << std::endl;
std::vector<int> anotherDestination; // Vector đích rỗng
// Sử dụng back_inserter để sao chép 3 phần tử
std::copy_n(source.begin() + 2, 3, std::back_inserter(anotherDestination));
std::cout << "anotherDestination after copy_n: ";
for (int x : anotherDestination) {
std::cout << x << " ";
}
std::cout << std::endl;
char arr[10] = {0}; // Mảng C-style
// Sao chép 4 ký tự từ một chuỗi sang mảng
std::string str = "Hello World";
std::copy_n(str.begin(), 4, arr);
std::cout << "arr after copy_n: " << arr << std::endl;
return 0;
}
Các hàm liên quan
copy_backward | 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, bắt đầu từ cuối của cả hai phạm vi và di chuyển ngược về phía đầu |
fill | Gán một giá trị cho tất cả các phần tử trong một phạm vi (range) được chỉ định |
replace | Thay 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) |