2009-09-23 22 views
5

Có thể chuyển quyền sở hữu nội dung vectơ từ véc tơ này sang véc tơ khác không?Chuyển quyền sở hữu trong các vùng chứa STL?

vector<T> v1; 
// fill v1 
vector<T> v2 = OvertakeContents(v1); 
// now v1 would be empty and v2 would have all the contents of v1 

Có thể cho danh sách có chức năng ghép nối. Điều này có thể xảy ra trong thời gian không đổi cho toàn bộ véc-tơ.

Nếu không thì tại sao không?

+2

mặt lưu ý: "hoán đổi" đã được đề cập rồi. Nhưng tôi muốn thêm rằng trong C + + 0x bạn chỉ có thể thay thế "OvertakeContents" với "std :: move" và nó sẽ làm những gì bạn muốn. – sellibitze

Trả lời

10

Check-out std :: swap

vector<T> v1; 
// fill v1 

vector<T> v2; 

swap(v1, v2); 
OR 
v2.swap(v1); 

Swap Reference

+1

ghi chú của bạn là hoàn toàn sai: tất cả các container STL cung cấp quá tải tương đương của std :: swap (a, b) với cùng ngữ nghĩa như a.swap (b) –

+0

@Greg. Cảm ơn bạn đã chỉ ra lỗi trong ghi chú của tôi. Khi xem xét tham chiếu cho Vector.swap, chúng thực sự có cùng ngữ nghĩa. –

10

std :: vector có một hàm swap() mà làm việc khá nhiều như thế này.

vector<T> v2; 
v2.swap(v1); 
+0

Tôi gần như upvoted bạn, tuy nhiên, mã của bạn là cú pháp sai. – avakar

+0

@avakar: Bạn nói đúng. Đã sửa. –

0

Ở đây có hai điểm:

1) Đối với bất kỳ loại gán, hoán đổi có thể được xác định theo phân công. Điều này đòi hỏi ba nhiệm vụ, mỗi nhiệm vụ, đối với một loại container, là tuyến tính trong kích thước của vùng chứa. Trong một ý nghĩa, sau đó, a.swap (b) là dư thừa. Nó tồn tại chỉ vì lợi ích của hiệu quả: đối với nhiều thùng chứa, chẳng hạn như vectơ và danh sách, có thể thực hiện hoán đổi sao cho độ phức tạp thời gian chạy của nó là không đổi thay vì tuyến tính. Nếu điều này là có thể cho một số loại container X, sau đó hoán đổi chuyên môn mẫu (X &, X &) có thể được viết đơn giản dưới dạng X :: swap (X &). Hàm ý của điều này là X :: swap (X &) chỉ nên được xác định nếu có tồn tại hằng số thời gian thực hiện. Không phải mọi lớp chứa X cần phải có một hàm thành viên như vậy, nhưng nếu hàm thành viên tồn tại ở tất cả thì nó được đảm bảo là thời gian cố định được phân bổ.

2) nếu bạn cần một container trong đó có yếu tố tương tự mà bạn muốn chuyển quyền sở hữu Hãy tạo một bản sao đơn giản cho hiệu quả tốt hơn