Vì vậy, tôi có một vector như vậy:Cách tốt nhất để xóa một std :: unique_ptr từ một vector với một con trỏ thô?
std::vector<std::unique_ptr<SomeClass>> myVector;
Sau đó, tôi có một vector chứa con trỏ nguyên của SomeClass
:
std::vector<SomeClass*> myOtherVector;
Nếu có một yếu tố bên trong myOtherVector
nó cũng sẽ được bên myVector
, vì vậy tôi muốn xem qua từng phần tử trong myOtherVector
và xóa cùng một phần tử khỏi myVector
. Sau đó xóa vector. Đây là những gì tôi đã đưa ra:
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), myOtherVector[i]), myVector.end());
}
myOtherVector.clear();
này tạo ra một lỗi thời gian biên dịch vì myVector
giữ con trỏ độc đáo nhưng tôi đưa ra các chức năng remove()
một con trỏ thô. Đây là nơi tôi cần giúp đỡ bởi vì tôi không biết cách thích hợp để giải quyết vấn đề này là gì. Tôi đã thay đổi dòng để:
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::unique_ptr<SomeClass>(myOtherVector[i])), myVector.end());
Frist của tất cả điều này là không chính xác bởi vì bây giờ tôi có hai std::unique_ptr
s tham khảo cùng một đối tượng. Phần tử bên trong myVector
chứa tham chiếu và việc xây dựng con trỏ duy nhất trong dòng trên là một tham chiếu khác. Và tôi thậm chí không biết nếu xây dựng một con trỏ mới để có được cùng một loại là khái niệm đúng cách để đi về việc này. Vì vậy, sau đó tôi đã thay đổi con trỏ duy nhất để con trỏ chia sẻ:
std::vector<std::shared_ptr<SomeClass>> myVector;
std::vector<SomeClass*> myOtherVector;
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::shared_ptr<SomeClass>(myOtherVector[i])), myVector.end());
}
myOtherVector.clear();
Khi tôi chạy các ứng dụng dòng myVector.erase()
dẫn đến một lỗi thời gian chạy mà nói "ApplicationName.exe đã gây ra một breakpoint." khi nhấp vào tiếp tục, tôi đã nhận được lỗi xác nhận lỗi.
Vì vậy, rõ ràng là tôi đang làm điều gì đó sai, nhưng tôi không biết điều gì. Cách chính xác để xóa một con trỏ thông minh từ một vector với một con trỏ thô là gì?
bạn đã xem xét đơn giản hóa vấn đề bằng cách người chỉ không duy trì một vector của các con trỏ nguyên để bắt đầu với? –
'std :: unique_ptr' có một thành viên' get' trả về con trỏ sở hữu. –
Uh, một gợi ý. Có một con trỏ thông minh C++ 11 khác gọi là 'std :: shared_ptr'. –