Vì vậy, tôi đang cố gắng loại bỏ std :: vector's bằng cách sử dụng boost :: ptr_vector. Bây giờ tôi đang cố gắng loại bỏ một phần tử từ một phần tử và xóa phần tử đã xóa. Điều rõ ràng nhất đối với tôi là:Cách xóa các phần tử khỏi tăng :: ptr_vector
class A
{ int m; };
boost::ptr_vector<A> vec;
A* a = new A;
vec.push_back(a);
vec.erase(a);
Nhưng điều này thậm chí sẽ không biên dịch (xem bên dưới để biết thông báo lỗi đầy đủ). Tôi đã thử xóa/loại bỏ thành ngữ như tôi sẽ trên một std :: vector nhưng tất cả các thuật toán của boost :: ptr_vector lần lượt ra được hơi khác nhau từ những người trong std :: vector.
Vì vậy, câu hỏi của tôi:
- Làm thế nào để loại bỏ một con trỏ từ một ptr_vector?
- Tôi vẫn cần phải xóa thủ công() phần tử mà tôi đã xóa?
biên dịch báo lỗi:
1>------ Build started: Project: ptr_vector_test, Configuration: Debug Win32 ------
1>Compiling...
1>ptr_vector_test.cpp
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2825: 'C': must be a class or namespace when followed by '::'
1> c:\users\rvanhout\svn\trunk\thirdparty\boost\mpl\eval_if.hpp(63) : see reference to class template instantiation 'boost::range_const_iterator<C>' being compiled
1> with
1> [
1> C=A *
1> ]
1> c:\users\rvanhout\svn\trunk\thirdparty\boost\range\iterator.hpp(63) : see reference to class template instantiation 'boost::mpl::eval_if_c<C,F1,F2>' being compiled
1> with
1> [
1> C=true,
1> F1=boost::range_const_iterator<A *>,
1> F2=boost::range_mutable_iterator<A *const >
1> ]
1> c:\users\rvanhout\svn\trunk\thirdparty\boost\ptr_container\detail\reversible_ptr_container.hpp(506) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled
1> with
1> [
1> C=A *const
1> ]
1> c:\tmp\ptr_vector_test\ptr_vector_test.cpp(21) : see reference to function template instantiation 'boost::void_ptr_iterator<VoidIter,T> boost::ptr_container_detail::reversible_ptr_container<Config,CloneAllocator>::erase<A*>(const Range &)' being compiled
1> with
1> [
1> VoidIter=std::_Vector_iterator<void *,std::allocator<void *>>,
1> T=A,
1> Config=boost::ptr_container_detail::sequence_config<A,std::vector<void *,std::allocator<void *>>>,
1> CloneAllocator=boost::heap_clone_allocator,
1> Range=A *
1> ]
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2039: 'const_iterator' : is not a member of '`global namespace''
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2146: syntax error : missing ';' before identifier 'type'
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2208: 'boost::type' : no members defined using this type
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : fatal error C1903: unable to recover from previous error(s); stopping compilation
1>Build log was saved at "file://c:\tmp\ptr_vector_test\Debug\BuildLog.htm"
1>ptr_vector_test - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
tôi nghĩ rằng bạn đã đúng về câu trả lời của tôi dưới đây. nếu tôi hiểu nó đúng, phân bổ mặc định (heap_clone_allocator) nhân bản các đối tượng chính nó khi tái phân bổ). nó sẽ làm việc nếu sử dụng view_clone_allocator. Tôi đã xóa câu trả lời của tôi và upvoted bạn. vui vẻ :) –
Cảm ơn bạn, vấn đề của tôi là tôi đã không định nghĩa toán tử == cho A * const và dường như là cần thiết. Để có được ví dụ của bạn để biên dịch (VC9), tôi đã phải thay đổi "Một const & rhs" thành "A * const & rhs" và thay đổi nội dung của cơ thể cho phù hợp. Điều đó làm cho nó khó sử dụng với các lớp thư viện. – Roel
Bạn đang thiếu điểm! Ptr_vector <> lưu trữ đối tượng như chúng là một đối tượng. Thay vì làm đảo lộn toán tử bình đẳng, chỉ cần bỏ tham chiếu đến con trỏ. Nếu bạn muốn tìm một con trỏ chính xác, bạn cần sử dụng hàm find_if và truyền một vị từ. –