2011-08-04 25 views
24

मेरे पास Nick नामक उपयोगकर्ता का प्रतिनिधित्व करने वाला एक वर्ग है और मैं std::find_if पर इसका उपयोग करना चाहता हूं, जहां मैं यह जानना चाहता हूं कि उपयोगकर्ता सूची वेक्टर में एक ही उपयोगकर्ता नाम के साथ एक ऑब्जेक्ट शामिल है या नहीं। मैंने बनाने की कोशिश करके कुछ प्रयास किए हैं उपयोगकर्ता नाम मैं परीक्षण करना चाहते हैं के लिए एक नया Nick वस्तु और == operator अधिक भार और फिर वस्तु पर find/find_if उपयोग करने की कोशिश:कस्टम वर्ग ऑब्जेक्ट्स के वेक्टर के साथ std :: find/std :: find_if का उपयोग कैसे करें?

std::vector<Nick> userlist; 
    std::string username = "Nicholas"; 

if (std::find(userlist.begin(), userlist.end(), new Nick(username, false)) != userlist.end())) { 
    std::cout << "found"; 
} 

मैं अतिभारित है == operator इसलिए की तुलना निक == Nick2 काम करना चाहिए, लेकिन समारोह रिटर्न error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Nick' (or there is no acceptable conversion)

यहाँ संदर्भ के लिए मेरी निक वर्ग है:

class Nick { 
private: 
    Nick() { 
     username = interest = email = ""; 
        is_op = false; 
    }; 
public: 
    std::string username; 
    std::string interest; 
    std::string email; 
    bool is_op; 

    Nick(std::string d_username, std::string d_interest, std::string d_email, bool d_is_op) { 
     Nick(); 
     username = d_username; 
     interest = d_interest; 
     email = d_email; 
     is_op = d_is_op; 
    }; 
    Nick(std::string d_username, bool d_is_op) { 
     Nick(); 
     username = d_username; 
     is_op = d_is_op; 
    }; 
    friend bool operator== (Nick &n1, Nick &n2) { 
     return (n1.username == n2.username); 
    }; 
    friend bool operator!= (Nick &n1, Nick &n2) { 
     return !(n1 == n2); 
    }; 
}; 

उत्तर

14

आपको ऑपरेटर == को अपनी कक्षा के बाहर दो ऑब्जेक्ट्स के साथ एक टूल फ़ंक्शन के रूप में परिभाषित करना है, सदस्य नहीं।

फिर इसे दोस्त बनाने के लिए बस कक्षा के अंदर समारोह की घोषणा करें।इस तरह

कोशिश कुछ:

class Nick { 

public: 
    friend bool operator== (const Nick &n1, const Nick &n2); 
}; 


bool operator== (const Nick &n1, const Nick &n2) 
{ 
     return n1.username == n2.username; 
} 

इसके अलावा अपने खोज इस तरह दिखना चाहिए:

std::find(userlist.begin(), userlist.end(), Nick(username, false)); 

'नई' की कोई आवश्यकता नहीं।

+0

वास्तव में, किसी मित्र फ़ंक्शन को परिभाषित करने के बजाय आपको केवल सदस्य फ़ंक्शन बूल ऑपरेटर == (कॉन्स्ट निक और ए) का उपयोग करना चाहिए। –

+1

आपके पास विकल्प है लेकिन वहां बहुत सारे प्रोग्रामर हैं जो सदस्य की आवश्यकता नहीं है, यदि आवश्यक नहीं है और ऑपरेटर को == बाहरी मुक्त मित्र कार्यों के रूप में रखना है। मुझे लगता है कि यह मानक पुस्तकालय कार्यान्वयन का भी मामला है। – Nikko

+0

जैसा आपने सुझाव दिया है बस कोशिश की। जवाब इस तरह दिखना नहीं चाहिए: 'std :: find (userlist.begin(), userlist.end(), और निक (उपयोगकर्ता नाम, झूठा));'? – Marschal

3

आप पा कार्य करने के लिए एक सूचक गुजर रहे हैं। नया ड्रॉप करें:

std::find(userlist.begin(), userlist.end(), Nick(username, false)) 

इसके अलावा, आपके ऑपरेटरों को कॉन्स्ट संदर्भ द्वारा उनके तर्क स्वीकार करना चाहिए, वे उन्हें संशोधित नहीं करते हैं।

bool operator== (const Nick &n1, const Nick &n2) 
0

आप को बढ़ावा देने :: बाँध का उपयोग कर सकते

std::find_if(userlist.begin(), userlist.end(), 
      boost::bind(& Nick::isFound, 
         _1)); 

बस को लागू bool निक :: isFound()

तुम भी मानदंड पर खरे उतर सकते हैं

std::find_if(userlist.begin(), userlist.end(), 
       boost::bind(& Nick::compare, 
          _1, 
          nick)); 

लागू
bool Nick::compare(const Nick & nick) 
{ 
    return this->username == nick.username; 
} 
1

मैं देख रहा हूँ कि आप इस तरह से एक-दूसरे निर्माता कॉल करने के लिए कोशिश कर रहे हैं:

Nick(std::string d_username, bool d_is_op) { 
     Nick(); 
... 

ठीक है, खेद है, लेकिन यह काम नहीं करता। रेखा Nick() बस एक अस्थायी बनाता है और this को प्रभावित नहीं करता है। कन्स्ट्रक्टर अग्रेषण केवल सी ++ 0x (आगामी मानक)

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

Mystical restriction on std::binary_search

HTH।

पीएस आदर्श रूप में यह एक टिप्पणी होनी चाहिए, लेकिन यह सिर्फ वर्बोज़

36

आप C++ 0x उपयोग कर रहे हैं आप एक सरल लैम्ब्डा अभिव्यक्ति

std::string username = "Nicholas";  
std::find_if(userlist.begin(), userlist.end(), [username](Nick const& n){ 
    return n.username == username; 
}) 
+7

वह नहीं कहता कि वह सी ++ 0 एक्स का उपयोग कर रहा है ... – Nikko

+13

@ निकोको वह यह भी नहीं कहता कि वह नहीं है। इस प्रकार इस जवाब की शुरुआत में "अगर" शब्द। –

+0

हां यह सब 2011 में किसी तरह की समझ में आया और शायद मेरी टिप्पणी के बाद एक संपादन हुआ ... – Nikko

9

मुझे पता है कि आप == ऑपरेटर को ओवरलोड चाहता था, लेकिन एक ही बात आसानी से विधेय के साथ किया जा सकता है का उपयोग कर सकते हैं:

struct UsernameIs { 
    UsernameIs(string s) : toFind(s) { } 
    bool operator() (const Nick &n) 
     { return n.username == toFind; } 
    string toFind; 
}; 

int main() 
{ 
    vector<Nick> vn(10); 
    string nameToFind = "something"; 
    find_if(vn.begin(), vn.end(), UsernameIs(nameToFind)); 
} 

ध्यान दें कि सी ++ 0x में, आप लैम्ब्डा अभिव्यक्ति के साथ एक ही चीज़ को अधिक संक्षेप में कर सकते हैं।

+0

मुझे 'त्रुटि मिल रही है: फ़ंक्शन उपयोगकर्ता नाम के लिए कोई मिलान नहीं है।' समस्या क्या हो सकती है? – Sitesh

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

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