तो मैं boost :: ptr_vector का उपयोग कर अपने std :: वेक्टर से छुटकारा पाने की कोशिश कर रहा हूं। अब मैं एक से तत्व को हटाने की कोशिश कर रहा हूं, और हटाए गए तत्व को भी हटा दिया गया है। मेरे लिए सबसे स्पष्ट बात यह थी:बढ़ावा से तत्वों को मिटाने के लिए कैसे करें :: ptr_vector
class A
{ int m; };
boost::ptr_vector<A> vec;
A* a = new A;
vec.push_back(a);
vec.erase(a);
लेकिन यह संकलित भी नहीं होगा (पूर्ण त्रुटि संदेश के लिए नीचे देखें)। मैंने मिट्टी को मिटा/निकालने की कोशिश की है जैसे कि मैं एक std :: वेक्टर पर होगा लेकिन boost :: ptr_vector के सभी एल्गोरिदम std :: vector में से थोड़ा अलग हो जाते हैं।
तो मेरे सवालों का:
- मैं एक ptr_vector से एक सूचक को कैसे निकालूं?
- क्या मुझे अभी भी हटाए गए तत्व को मैन्युअल रूप से हटाने की आवश्यकता है?
संकलक त्रुटि:
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 ==========
मुझे लगता है कि आप नीचे मेरे उत्तर के बारे में सही थे। अगर मैं इसे सही समझता हूं, तो डिफ़ॉल्ट आवंटक (heap_clone_allocator) पुन: आवंटित करते समय ऑब्जेक्ट्स को क्लोन करता है)। हालांकि view_clone_allocator का उपयोग करते हुए यह काम करता। मैंने अपना जवाब हटा दिया है और आपको ऊपर उठाया है। मज़े करें :) –
धन्यवाद, मेरी समस्या यह थी कि मैंने ए * कॉन्स के लिए == ऑपरेटर को परिभाषित नहीं किया था और जो आवश्यक लगता है। संकलन (वीसी 9) के लिए अपना उदाहरण प्राप्त करने के लिए, मुझे "ए कॉन्स एंड आरएस" को "ए * कॉन्स एंड आरएस" में बदलना पड़ा और उसके अनुसार शरीर की सामग्री को बदलना पड़ा। हालांकि लाइब्रेरी कक्षाओं के साथ इसका उपयोग करना मुश्किल हो जाता है। – Roel
आप बिंदु खो रहे हैं! Ptr_vector <> ऑब्जेक्ट को स्टोर करता है जैसे कि वे एक ऑब्जेक्ट हैं। समानता ऑपरेटर को प्रतिबिंबित करने के बजाय पॉइंटर को डी-रेफरेंस करें। यदि आप एक सटीक सूचक खोजना चाहते हैं तो आपको find_if का उपयोग करने और भविष्यवाणी करने की आवश्यकता है। –