2012-03-19 55 views
25

Nếu tôi có hai vectơ và muốn kết hợp chúng với một, tôi có thể làm điều đó theo cách sau:"di chuyển" hai vectơ cùng

std::vector<T> a(100); // just some random size here 
std::vector<T> b(100); 

a.insert(std::end(a), std::begin(b), std::end(b)); 

Đó bao gồm sao chép mặc dù, mà tôi muốn tránh. Có cách nào để sử dụng di chuyển-ngữ nghĩa để có được chúng với nhau?
Tôi rất nghi ngờ nó, như là một vector được cho là tiếp giáp. Tuy nhiên có cách nào để làm điều đó với một deque?

Trả lời

48

Có, sử dụng std::move:

#include <algorithm> 
std::move(b.begin(), b.end(), std::back_inserter(a)); 

Ngoài ra, bạn có thể sử dụng lặp di chuyển:

a.insert(a.end(), 
     std::make_move_iterator(b.begin()), std::make_move_iterator(b.end())); 

Hãy nhớ #include <iterator> trong cả hai trường hợp, và trước khi bạn bắt đầu, nói:

a.reserve(a.size() + b.size()); 

Tùy thuộc vào chi phí khởi tạo giá trị so với kiểm tra và tăng trong bộ đếm kích thước, biến thể sau cũng có thể thú vị:

std::size_t n = a.size(); 
a.resize(a.size() + b.size()); 
std::move(b.begin(), b.end(), a.begin() + n); 
+0

Cảm ơn, bây giờ tôi biết tại sao có hai phiên bản 'std :: move' trên cppreference. Tôi luôn nghĩ đó là một lỗi và không kiểm tra phiên bản thứ hai. – inf

+3

Tôi đã hoàn toàn bỏ lỡ rằng 'di chuyển' cũng là một thuật toán. – bames53

+0

@ bames53 cùng niềm vui với tôi, nhưng sau khi nghe nó, nó có ý nghĩa hoàn toàn vì cũng có 'copy'. – inf

7

Phụ thuộc vào chính xác những gì bạn muốn di chuyển. Khi bạn di chuyển một vector, nó được thực hiện bằng cách hoán đổi một cách hiệu quả con trỏ mảng nội bộ. Vì vậy, bạn có thể tạo một điểm vector cho mảng trước đây thuộc sở hữu của một véc-tơ khác.

Nhưng điều đó sẽ không cho phép bạn hợp nhất hai vectơ.

Điều tốt nhất bạn có thể làm sau đó là để di chuyển tất cả các yếu tố thành viên cá nhân, như thể hiện trong câu trả lời của Kerrek:

std::move(b.begin(), b.end(), std::back_inserter(a)); 

Một lần nữa, điều này sẽ lặp qua các vector và di chuyển tất cả các yếu tố để các vector mục tiêu.

+0

Một câu hỏi, nó tạo ra sự khác biệt nào? Chúng ta không chủ yếu sao chép các đối tượng vào một vị trí tại b? Nó sẽ không làm điều tương tự như chèn như trong câu hỏi của op? – nnrales

+0

Tôi cho rằng nếu các đối tượng trong một phức tạp, thì ctors sao chép của chúng sẽ không được gọi, chỉ là một bản sao bộ nhớ? – nnrales