2013-02-28 10 views
5

तो मैं एक वेक्टर इसलिए की तरह है:एक कच्चे सूचक के साथ एक वेक्टर से std :: unique_ptr को हटाने का सबसे अच्छा तरीका?

std::vector<std::unique_ptr<SomeClass>> myVector; 

तो मेरे पास है एक और वेक्टर जो SomeClass के कच्चे संकेत शामिल हैं:

std::vector<SomeClass*> myOtherVector; 

अगर वहाँ myOtherVector अंदर एक तत्व यह भी myVector अंदर हो जाएगा, इसलिए मैं प्रत्येक तत्व को myOtherVector में जाना चाहता हूं और myVector से उसी तत्व को हटा देना चाहता हूं। फिर वेक्टर को साफ़ करें।

for(size_t i = 0; i < myOtherVector.size(); i++) 
{ 
    myVector.erase(std::remove(myVector.begin(), myVector.end(), myOtherVector[i]), myVector.end()); 
} 
myOtherVector.clear(); 

यह एक संकलन समय त्रुटि पैदा करता है क्योंकि myVector अद्वितीय संकेत रखती है, लेकिन मैं remove() समारोह एक कच्चे सूचक दे ​​रहा हूँ: यह है कि मैं क्या के साथ आया है। यह वह जगह है जहां मुझे सहायता चाहिए क्योंकि मुझे नहीं पता कि इस समस्या को हल करने का उचित तरीका क्या होगा।

यह सब के
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::unique_ptr<SomeClass>(myOtherVector[i])), myVector.end()); 

Frist क्योंकि अब मैं एक ही वस्तु को संदर्भित दो std::unique_ptr रों है वह सही नहीं है: मैं करने के लिए लाइन बदल दिया है। myVector के अंदर तत्व एक संदर्भ है और उपरोक्त रेखा में अद्वितीय सूचक का निर्माण एक और संदर्भ है। और मुझे यह भी पता नहीं है कि एक ही प्रकार प्राप्त करने के लिए एक नया सूचक बनाने का संकल्पनात्मक रूप से ऐसा करने का सही तरीका है। तो फिर मैं साझा संकेत के लिए अद्वितीय संकेत बदल दिया है: "। ApplicationName.exe एक ब्रेकपाइंट शुरू हो गया है"

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(); 

जब मैं आवेदन myVector.erase() लाइन एक रनटाइम त्रुटि जिसमें कहा गया में हुई भागा जारी रखने पर क्लिक करने पर मुझे डीबग दावा विफलता मिली।

तो जाहिर है कि मैं कुछ गलत कर रहा हूं, लेकिन मुझे नहीं पता कि क्या। कच्चे सूचक के साथ वेक्टर से स्मार्ट पॉइंटर मिटाने का सही तरीका क्या है?

+0

आप पर विचार किया है से निर्दिष्ट करने के लिए) की आवश्यकता होगी? –

+0

'std :: unique_ptr' में' get' सदस्य है जो स्वामित्व वाले पॉइंटर को लौटाता है। –

+1

उह, एक सुझाव। 'Std :: shared_ptr' नामक एक और सी ++ 11 स्मार्ट पॉइंटर है। –

उत्तर

1

यह मैं इसे कैसे करना होगा है। प्रदर्शन में सुधार किया जा सकता है, लेकिन जब तक यह आपके आवेदन के लिए बाधा साबित नहीं होगा, मैं उससे परेशान नहीं होगा। एल्गोरिदम सरल और स्पष्ट है।

यह पहले कंटेनर (myVector) से चुनिंदा निकालने के लिए remove_if का उपयोग करता है जो दूसरे कंटेनर (myOtherVector) के तत्वों द्वारा इंगित वस्तुओं को इंगित करने वाले सभी तत्व; फिर, यह दूसरे कंटेनर को साफ़ करता है। ,

#include <vector> 
#include <memory> 
#include <algorithm> 

struct SomeClass { /* ... */ }; 

int main() 
{ 
    std::vector<std::unique_ptr<SomeClass>> myVector; 
    std::vector<SomeClass*> myOtherVector; 

    myVector.erase(
     std::remove_if(// Selectively remove elements in the second vector... 
      myVector.begin(), 
      myVector.end(), 
      [&] (std::unique_ptr<SomeClass> const& p) 
      { // This predicate checks whether the element is contained 
       // in the second vector of pointers to be removed... 
       return std::find(
        myOtherVector.cbegin(), 
        myOtherVector.cend(), 
        p.get() 
        ) != myOtherVector.end(); 
      }), 
     myVector.end() 
     ); 

    myOtherVector.clear(); 
} 
3

std::unique_ptr में एक सदस्य फ़ंक्शन है, get, जो स्वामित्व वाले पॉइंटर को लौटाता है।

निम्नलिखित पर विचार करें:

std::sort(myOtherVector.begin(), myOtherVector.end()); 

myVector.erase(std::remove_if(myVector.begin(), myVector.end(), 
[&](std::unique_ptr<SomeClass> const& p) -> bool 
{ 
    return std::binary_search(myOtherVector.begin(), myOtherVector.end(), 
           p.get()); 
})); 

myOtherVector.clear();  
0

आप अपनी समस्या को आसान बनाने में कर सकते हैं कि कैसे std :: set_difference या उसके परिजन (http://www.cplusplus.com/reference/algorithm/set_difference/) में से एक के बारे में: विधेय एक लैम्ब्डा समारोह के माध्यम से कार्यान्वित किया जाता है?

आप एक पाने के लिए (समारोह तुलना कच्चे सूचक unique_ptr जो सिर्फ कच्चे संकेत का एक वेक्टर को बनाए रखने के साथ शुरू करने के लिए नहीं कर समस्या को सरल बनाने

संबंधित मुद्दे