std::copy_backward
#include <algorithm>
template <class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 copy_backward (BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 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, bắt đầu từ cuối của cả hai phạm vi và di chuyển ngược về phía đầu. Điều này hữu ích khi phạm vi nguồn và đích chồng chéo lên nhau.
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
- Bidirectional Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi đích nơi các phần tử sẽ được sao chép đến.
Giá trị trả về
- Bidirectional Iterator trỏ đến phần tử đầu tiên trong phạm vi đích mà phần tử từ phạm vi nguồn đã được sao chép đến. Nói cách khác, nó trỏ đến đầu của phần đã ghi trong phạm vi đích.
Đặc điểm
- Phạm vi nguồn
[first, last)
là "nửa mở", không bao gồm phần tửlast
. - Phạm vi đích phải có đủ không gian để chứa các phần tử được sao chép.
copy_backward()
ghi đè các phần tử hiện có trong phạm vi đích.copy_backward()
yêu cầu Bidirectional Iterator, cho phép di chuyển theo cả hai hướng (tiến và lùi).- Nếu phạm vi nguồn và đích không chồng chéo, bạn có thể sử dụng
copy()
thông thường. - Thứ tự các phần tử trong phạm vi đích giống với thứ tự trong phạm vi nguồn.
- Phạm vi nguồn và phạm vi đích có thể là một (tự sao chép chính nó).
copy_backward()
thường được sử dụng khi:- Phạm vi nguồn và đích chồng chéo lên nhau và bạn muốn sao chép mà không ghi đè dữ liệu trước khi nó được sao chép.
- Bạn muốn sao chép các phần tử theo thứ tự ngược lại.
- Bạn cần dịch chuyển các phần tử trong một container về phía sau.
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
// Dịch chuyển các phần tử từ vị trí 0-2 sang vị trí 3-5
std::copy_backward(numbers.begin(), numbers.begin() + 3, numbers.begin() + 6);
std::cout << "numbers after shifting elements: ";
for (int x : numbers) {
std::cout << x << " ";
}
std::cout << std::endl;
std::vector<int> source = {7, 8, 9};
std::vector<int> destination(6);
// Sao chép source vào cuối destination
std::copy_backward(source.begin(), source.end(), destination.end());
std::cout << "destination after copy_backward: ";
for (int x : destination) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
Các hàm liên quan
reverse_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 theo thứ tự đảo ngược |
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 |
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) |