std::move_backward
#include <algorithm>
template <class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 move_backward (BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 result);
Di chuyển 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, sử dụng move semantics (ngữ nghĩa di chuyển) của C++11. Tương tự copy_backward()
, hàm 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 di chuyển.
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 di chuyển đế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 di chuyển đến.
Đặ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 di chuyển.
move_backward()
ghi đè các phần tử hiện có trong phạm vi đích.move_backward()
yêu cầu Bidirectional Iterator, cho phép di chuyển theo cả hai hướng.- Nếu phạm vi nguồn và đích không chồng chéo, bạn có thể sử dụng
move()
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.
move_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 di chuyển các phần tử mà không ghi đè dữ liệu trước khi nó được di chuyển, đồng thời tận dụng move semantics để tối ưu hiệu năng.
- Bạn muốn di chuyển các phần tử theo thứ tự ngược lại, sử dụng move semantics.
- Bạn cần dịch chuyển các phần tử trong một container về phía sau, sử dụng move semantics.
- Move Semantics (Ngữ nghĩa di chuyển):
- Tương tự
move()
,move_backward()
sử dụng move semantics. Thay vì sao chép, nó chuyển tài nguyên từ đối tượng nguồn sang đối tượng đích. - Sau khi di chuyển, đối tượng nguồn sẽ ở trong trạng thái hợp lệ nhưng không xác định.
- Tương tự
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
int main() {
std::vector<std::string> words = {"one", "two", "three", "four", "five", "six"};
// Dịch chuyển các phần tử từ vị trí 0-2 sang vị trí 2-4, sử dụng move semantics
std::move_backward(words.begin(), words.begin() + 3, words.begin() + 5);
std::cout << "words after shifting elements: ";
for (const std::string& w : words) {
std::cout << w << " "; // Các phần tử đã move có thể để lại giá trị không xác định
}
std::cout << std::endl;
std::vector<std::unique_ptr<int>> ptrSource;
ptrSource.push_back(std::make_unique<int>(10));
ptrSource.push_back(std::make_unique<int>(20));
ptrSource.push_back(std::make_unique<int>(30));
std::vector<std::unique_ptr<int>> ptrDestination(5);
// Di chuyển các unique_ptr từ cuối source vào cuối destination
std::move_backward(ptrSource.begin(), ptrSource.end(), ptrDestination.end());
std::cout << "ptrDestination after move_backward: ";
for (const auto& ptr : ptrDestination) {
if (ptr) {
std::cout << *ptr << " ";
} else {
std::cout << "nullptr ";
}
}
std::cout << std::endl;
return 0;
}
Các hàm liên quan
move | Di chuyển các phần tử từ một phạm vi (range) nguồn sang một phạm vi đích khác, sử dụng move semantics |
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 |