2009-05-07 10 views
12

के वेक्टर के साथ एसटीएल एल्गोरिदम का उपयोग कैसे करूं मेरे पास पॉइंटर्स का वेक्टर है जो कंटेनर के स्वामित्व में नहीं हैं। मैं पॉइंटर्स के लक्ष्यों पर एल्गोरिदम का उपयोग कैसे करूं? मैंने बूस्ट के ptr_vector का उपयोग करने की कोशिश की, लेकिन जब यह दायरे से बाहर हो जाता है तो पॉइंटर्स को हटाने की कोशिश करता है।मैं पॉइंटर्स

यहाँ कुछ कोड काम करने की जरूरत है कि:

vector<int*> myValues; 
// ... myValues is populated 
bool consistent = count(myValues.begin(), myValues.end(), myValues.front()) == myValues.size(); 
auto v = consistent ? myValues.front() : accumulate(myValues.begin(), myValues.end(), 0)/myValues.size(); 
fill(myValues.begin(), myValues.end(), v); 
// etc. 

मुझे लगता है कि छोरों के लिए काम करेगा, लेकिन यह स्थानों में से एक गुच्छा में होता है, तो एकल अनुकूलक किसी तरह का? मैं एक खोजने में सक्षम नहीं था। अग्रिम में धन्यवाद!

+0

यदि आप अभी तक अपने प्रश्नों में अनुमोदित भविष्य सी ++ मानक की सुविधाओं का उपयोग करते हैं, तो आप जो उत्तरों प्राप्त करते हैं, उन्हें सीमित कर देंगे। यह बहुत अस्पष्ट है यदि आपका प्रश्न टीएच वर्तमान मानक पुस्तकालय, बूस्ट का उपयोग, या सी ++ 0x की नई विशेषताओं के बारे में है। –

+0

ऐसा लगता है कि वी को इंट्स का औसत मान माना जाता है, लेकिन फिर कॉपी लाइन v को कॉपी करने की कोशिश करती है, इसलिए वी को पॉइंटर या इटरेटर होना चाहिए। –

+0

ओह हाँ, वह अंतिम पंक्ति गलत थी ... मेरा मतलब "प्रतिलिपि" के बजाय "भरना" लिखना था। –

उत्तर

19

आप Boost Indirect Iterator का उपयोग कर सकते हैं। जब dereferenced (operator*() के साथ), यह एक अतिरिक्त अव्यवस्था लागू करता है, तो आप इटरेटर द्वारा संदर्भित सूचक द्वारा इंगित मूल्य के साथ समाप्त होते हैं। अधिक जानकारी के लिए, आप this question about a dereference iterator भी देख सकते हैं।

यहाँ एक सरल उदाहरण है:

std::vector<int*> vec; 

vec.push_back(new int(1)); 
vec.push_back(new int(2)); 

std::copy(boost::make_indirect_iterator(vec.begin()), 
      boost::make_indirect_iterator(vec.end()), 
      std::ostream_iterator<int>(std::cout, " "));  // Prints 1 2 
+0

यह वही है जो मैं खोज रहा था, धन्यवाद! –

+0

ओह, अच्छा, यह आपका प्रश्न था - ज्ञान को पारित करने का तरीका;) –

0

आप boost::shared_ptr<> पर देख सकते हैं - संदर्भ गणना के साथ एक स्मार्ट सूचक। यह दायरे से बाहर होने के बाद सूचक को हटा नहीं देगा।

+0

समस्या यह है कि पॉइंटर्स अन्य ऑब्जेक्ट्स में सदस्य चर के लिए हैं। मैं उन्हें shared_ptr में भी बना सकता हूं, लेकिन ऐसा करने का यह सबसे प्रभावी तरीका नहीं हो सकता है। –

3
bool consistent = count_if(myValues.begin(), myValues.end(), 
    bind2nd(ptr_fun(compare_ptr), *myValues.front())) == myValues.size(); 

int v = consistent ? *myValues.front() : accumulate(
    myValues.begin(), myValues.end(), 0, sum_int_ptr)/myValues.size(); 

for_each(myValues.begin(), myValues.end(), bind1st(ptr_fun(assign_ptr),v)); 

भरण समारोह आवंटित नहीं ले जा सकते हैं (इसलिए यह संकेत भिन्नता होगा कि)। इसलिए for_each() का उपयोग किया गया था। अनुकूलन के लिए for_each() चलाने से पहले अगर (! संगत) जोड़ना बुद्धिमान होगा। उपरोक्त एसटीएल एक लाइनर में उपयोग किए गए कार्यों:

int sum_int_ptr(int total, int * a) { return total + *a; }  
void assign_ptr(int v, int *ptr) { *ptr = v; }  
bool compare_ptr(int* a, int pattern) { return *a == pattern; } 
+1

धन्यवाद, मैंने आपके उत्तर से बहुत कुछ सीखा। मैं शायद यहां पर बढ़ावा देने वाले अप्रत्यक्ष इटरेटर्स के साथ जाऊंगा, लेकिन यह जानना अच्छा है कि bind1st, bind2nd, और इसी तरह का उपयोग कैसे करें। –

+0

हाँ एसटीएल काफी शक्तिशाली है, इन सभी एक-लाइनर को जमा करने के लायक है, आदि –

+1

पीएस .: वर्थ रीडिंग: http://www.keithschwarz.com/cs106l/fall2007/handouts/200_STL_Functional_Library.pdf –

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