2011-10-11 34 views
11

Trước C++11 Tôi đã sử dụng hoán đổi-to-back để tránh các chi phí bản sao sâu, như:using std :: di chuyển

vector<vector<Object> > Objects; 

for(/* some range */) 
{ 
    vector<Object> v; 
    for(/* some other range */) 
    { 
     v.push_back(/* some object */); 
    } 
    Objects.push_back(vector<Object>()); 
    Objects.back().swap(v); 
} 

Làm thế nào tôi có thể sử dụng để di chuyển std::movev vào Objects để tránh sao chép sâu overhead thay vì swap?
Tôi biết có rất nhiều cách giải quyết ở đây như nhiều mảng hoặc chỉ chèn trực tiếp vào Objects.back(), nhưng tôi cần một ví dụ về cách sử dụng std::move để hiểu nó.

+2

Tại sao bạn tạo 'v'? Tại sao không chỉ thêm một vector trống vào các đối tượng và sau đó là 'Objects.back(). Push_back()' vào nó? Điều đó loại bỏ nhiều chi phí hơn trong khi đơn giản hơn. – Ayjay

+0

@Ayjay: đọc phần còn lại của câu hỏi – Dani

Trả lời

16
vector<vector<Object> > Objects; 

for(/* some range */) 
{ 
    vector<Object> v; 
    for(/* some other range */) 
    { 
     v.push_back(/* some object */); 
    } 
    Objects.push_back(std::move(v)); 
} 
+0

Nhưng điều đó để lại 'v' phía sau. Tôi hiểu rằng 'std :: move' nên phần nào phá hoại. – Dani

+2

@Dani: Đừng giả sử. Thử nó. Trên thực tế, việc đọc nguồn cho 'vector :: vector (vector &&)' cũng sẽ là đủ. Các ngữ nghĩa gần giống với phiên bản 'std :: swap' của bạn - nhưng thanh lịch hơn và có thể hiệu quả hơn trong trường hợp chung – sehe

+0

Chắc chắn hiệu quả hơn nếu hàm tạo mặc định' Object' là không tầm thường. – ildjarn

17
Objects.push_back(std::move(v)); 
+2

+1 để có câu trả lời đúng và nhận được sự chú ý ít hơn nhiều – sehe

Các vấn đề liên quan