2010-04-16 24 views
6

मैं std::find के इंटरफ़ेस के बारे में उलझन में हूं। यह Compare ऑब्जेक्ट क्यों नहीं लेता है जो बताता है कि दो वस्तुओं की तुलना कैसे करें?एक वस्तु ऑब्जेक्ट का उपयोग करके std :: ढूंढें कैसे करें?

मैं सिर्फ सीधे सूचक मानों की तुलना करने के बजाय एक Compare वस्तु मैं निम्नलिखित कोड काम कर सकता है, जहां मैं मूल्य से तुलना करने के लिए चाहते हैं, पारित कर सकता है:

typedef std::vector<std::string*> Vec; 
Vec vec; 
std::string* s1 = new std::string("foo"); 
std::string* s2 = new std::string("foo"); 
vec.push_back(s1); 
Vec::const_iterator found = std::find(vec.begin(), vec.end(), s2); 
// not found, obviously, because I can't tell it to compare by value 
delete s1; 
delete s2; 

निम्नलिखित की सिफारिश की रास्ता है इसे करने के लिए?

template<class T> 
struct MyEqualsByVal { 
    const T& x_; 
    MyEqualsByVal(const T& x) : x_(x) {} 
    bool operator()(const T& y) const { 
    return *x_ == *y; 
    } 
}; 
// ... 
vec.push_back(s1); 
Vec::const_iterator found = 
    std::find_if(vec.begin(), vec.end(), 
       MyEqualsByVal<std::string*>(s2)); // OK, will find "foo" 

उत्तर

6

find को मूल्य के बजाय एक असीमित भविष्यवाणी करने के लिए ओवरलोड नहीं किया जा सकता है, क्योंकि यह एक अनजान टेम्पलेट पैरामीटर है। इसलिए यदि आप find(first, last, my_predicate) कहलाते हैं, तो एक संभावित अस्पष्टता होगी कि क्या आप सीमा के प्रत्येक सदस्य पर भविष्यवाणी का मूल्यांकन करना चाहते हैं, या फिर आप उस सीमा के सदस्य को ढूंढना चाहते हैं जो भविष्यवाणी के बराबर है (यह एक सीमा हो सकती है भविष्यवाणियों के लिए, मानक पुस्तकालयों के सभी डिजाइनरों को पता या देखभाल करने के लिए, या value_type इटरेटर का अनुमानित प्रकार दोनों को परिवर्तनीय रूप से परिवर्तित किया जा सकता है, और इसके argument_type)। इसलिए एक अलग नाम के तहत जाने के लिए find_if की आवश्यकता।

find के लिए खोज किए गए मूल्य के अतिरिक्त वैकल्पिक बाइनरी भविष्यवाणी करने के लिए अधिभारित किया जा सकता था। लेकिन जैसा कि आपने किया है, मज़दूरों में मूल्यों को कैप्चर करना, ऐसी मानक तकनीक है जो मुझे नहीं लगता कि यह एक बड़ा लाभ होगा: यह निश्चित रूप से कभी भी जरूरी नहीं है क्योंकि आप हमेशा find_if के साथ एक ही परिणाम प्राप्त कर सकते हैं।

यदि आपको find मिल गया है, तो आपको अभी भी एक मज़ेदार (या बूस्ट का उपयोग) लिखना होगा, क्योंकि <functional> में किसी सूचक को कम करने के लिए कुछ भी शामिल नहीं है। आपका मज़ेदार बाइनरी भविष्यवाणी के रूप में थोड़ा आसान होगा, या आप फ़ंक्शन पॉइंटर का उपयोग कर सकते हैं, इसलिए यह मामूली लाभ होगा। तो मुझे नहीं पता कि यह क्यों प्रदान नहीं किया जाता है। copy_if फियास्को को देखते हुए मुझे यकीन नहीं है कि एल्गोरिदम के लिए हमेशा अच्छे कारण नहीं हैं जो उपलब्ध नहीं हैं :-)

+0

धन्यवाद! जिज्ञासा से, 'copy_if' के साथ क्या गलत है? – Frank

+1

@ डेहमान: इसके साथ गलत बात यह है कि यह मानक में नहीं है। एक संपादन दुर्घटना के कारण यह अनिवार्य रूप से बाहर निकल गया। –

2

अपने T के बाद से एक सूचक है, आप के रूप में अच्छी समारोह वस्तु में सूचक की एक प्रति संग्रहीत कर सकते हैं।

इसके अलावा, ऐसा ही किया जाता है और इसके लिए बहुत कुछ नहीं है।

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

+0

और ... मैं पूरी तरह से प्रश्न के पहले भाग को याद करता हूं ... ओह। हालांकि, स्टीव जेसॉप का जवाब बेहतर है जितना मैं इसे समझा सकता था। –

0

यह वही है जो find_if है - यह एक अनुमान लगाता है जिसे तत्वों की तुलना करने के लिए कहा जाता है।

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