2011-11-29 12 views
9

में संदर्भ द्वारा भविष्यवाणी करता है मैं std::list से तत्वों को निकालने का प्रयास कर रहा हूं और हटाए गए तत्वों के कुछ आंकड़े रखता हूं।पास std algos सी ++

ऐसा करने के लिए, मैं सूची से remove_if फ़ंक्शन का उपयोग करता हूं, और मेरे पास एक अनुमान है। मैं आंकड़ों को इकट्ठा करने के लिए इस भविष्यवाणी का उपयोग करना चाहता हूं।

class TestPredicate 
    { 
    private: 
    int limit_; 

    public: 
    int sum; 
    int count; 
    TestPredicate(int limit) : limit_(limit), sum(0), count(0) {} 

    bool operator() (int value) 
    { 
     if (value >= limit_) 
     { 
     sum += value; 
     ++count;  // Part where I gather the stats 
     return true; 
     } 
     else 
     return false; 
    } 
    }; 

यहाँ और algo के लिए कोड है:: यहाँ विधेय के लिए कोड है

std::list <int> container; 
container.push_back(11); 
TestPredicate pred(10); 
container.remove_if(pred) 
assert(pred.count == 1); 

दुर्भाग्य से, जोर झूठी क्योंकि विधेय मूल्य द्वारा पारित किया गया है। संदर्भ के द्वारा पारित करने के लिए मजबूर करने का कोई तरीका है?

+1

मुझे नहीं पता कि यह सीधे किया जा सकता है, लेकिन आप वांछित प्रभाव प्राप्त करने के लिए वास्तविक भविष्यवाणी के लिए एक संदर्भ या सूचक युक्त एक रैपर का उपयोग कर सकते हैं। –

+0

यह एक अच्छा विचार है। तो मैं किसी भी अनुमानित संदर्भ को लपेटने के लिए एक टेम्पलेट बना सकता हूं ... जो मुझे आश्चर्यचकित करता है कि ऐसा टेम्पलेट stl या boost में मौजूद है ... – Arthur

+0

@jules: अपने पोस्ट के लिए अपने टेम्पलेट समाधान में संशोधन करने के लिए स्वतंत्र महसूस करें! (मैं थोड़ी परेशान हूं हालांकि 'std :: tr1 :: ref' सी ++ 03 में नौकरी नहीं करता है।) ** अपडेट: ** इसे मिला! संपादन ... –

उत्तर

15

<functional> से एक संदर्भ आवरण, उपलब्ध दर्रा:

container.remove_if(std::ref(pred)); 

आप केवल है, तो सी ++ 98/03, लेकिन अपने संकलक TR1 है, तो आप उपयोग कर सकते हैं <tr1/functional> और std::tr1::ref यदि आप एक छोटे बनाने अपने विधेय में संशोधन:

#include <tr1/functional> 

class TestPredicate : public std::unary_function<int, bool> 
{     //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    // ... 
} 

container.remove_if(std::tr1::ref(pred)); 

यदि सब और विफल रहता है, टी मुर्गी आप अपेक्षाकृत आसानी से एक मैनुअल समाधान ऊपर हैक कर सकते हैं:

struct predref 
{ 
    TestPredicate & p; 
    bool operator()(int n) { return p(n); } 
    predref(TestPredicate & r) : p(r) { } 
}; 

container.remove_if(predref(pred)); 
+0

यह सी ++ टीआर 1 से है लेकिन एक अच्छा जवाब +1 –

2

functors एल्गोरिदम को पारित कर दिया, एल्गोरिथ्म के अंदर कॉपी किया जा सकता बार की एक अनिश्चित संख्या ताकि आप functor में सीधे राज्य की दुकान नहीं कर सकते हैं। दूसरी तरफ, आप कुछ बाहरी राज्य संरचना के सूचक या संदर्भ का उपयोग कर, मज़ेदार के बाहर राज्य को स्टोर कर सकते हैं।

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