2015-05-05 13 views
7

tôi có hai bộ và một iterator để một phần tử của a:Move 'unique_ptr`s giữa các bộ

set<unique_ptr<X>> a, b; 
set<unique_ptr<X>>::iterator iter = find something in a; 

Tôi muốn loại bỏ các yếu tố được trỏ bởi iter từ a và chèn nó vào b. Có thể không? Làm sao?

+0

@black: Tôi tin rằng câu hỏi là độc lập. Nếu bạn đủ thông minh để trả lời, các vấn đề nên được hiển nhiên cho bạn. – ybungalobill

+0

Theo quan điểm của tôi, vấn đề phải hiển nhiên trong câu hỏi và không nên yêu cầu bạn viết mã gì đó để hiển thị. Vấn đề tôi thấy có thể khác với những gì bạn thấy. Tôi gặp vấn đề với 'const'ness, còn bạn thì sao? – edmz

+1

@black: Bạn không cần mã gì cả. Trong thực tế, tôi thậm chí không cố gắng biên dịch bất kỳ mã nào vì tôi biết đủ ngôn ngữ để biết rằng chèn và xóa sẽ không hoạt động. Câu hỏi được giải quyết cho những người biết tiêu chuẩn C++ đủ tốt và có thể chỉ cho tôi một phần cụ thể của giao diện std :: set, hoặc một sự kết hợp của chúng, mà sẽ thực hiện những gì tôi cần. Câu hỏi đặt ra là ở đó, và nếu bạn nghĩ rằng mọi vấn đề trên SO đều chuyển thành lỗi biên dịch, quá xấu đối với bạn. – ybungalobill

Trả lời

2

Vâng, tôi nghi ngờ không có cách nào bình thường để làm điều đó. Nhưng luôn luôn có một tổ chức phi bình thường một :) Bạn có thể làm như sau:

auto tmp = const_cast<std::unique_ptr<std::string>&&>(*iter); 
a.erase(iter); 
b.insert(std::move(tmp)); 

Ok, dòng đầu tiên vi phạm set bất biến và nó là khủng khiếp nhưng như xa như tôi hiểu nó không phải là một vấn đề kể từ trên dòng tiếp theo, chúng tôi loại bỏ nút độc ác này khỏi tập hợp.

+0

Điều này sẽ không làm mất hiệu lực của unique_ptr khi xóa? –

+0

@TasosVogiatzoglou, không có nó sẽ không. Chúng tôi đã di chuyển đối tượng từ tập hợp 'a' sang' tmp' và khi xóa đặt 'a' chứa đối tượng' di chuyển-từ' 'unique_ptr'. – ixSci

+0

Ồ, được rồi. Khi tôi đang đọc nó, tôi nghĩ rằng khi tẩy xoá các deleter được gọi là. –

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