2012-08-23 20 views
8

मैं सेट का उपयोग कर रहा हूं। मैं कुंजी के रूप में एक कस्टम संरचना का उपयोग करें। मैं एक मूल्य डाल रहा हूं और सम्मिलित मूल्य ढूंढने की कोशिश कर रहा हूं। लेकिन यह तत्व कभी नहीं लगता है।सी ++ std :: सेट फ़ंक्शन ओवरलोडिंग == ऑपरेटर

मैंने दोनों == ऑपरेटर और < ऑपरेटर को ओवरराइड कर दिया है।

यहाँ संरचना के कोड है:

struct distance_t 
{ 
public: 
int id; 
double distance; 

bool operator<(const distance_t& rhs) const 
{ 
    if(distance < rhs.distance) 
     return true; 
    else 
     return false; 
} 

bool operator==(const distance_t& rhs) 
{ 
    if(id == rhs.id) 
     return true; 
    else 
     return false; 
} 
}; 

और यह मुख्य

int main() 
{ 
    set<distance_t> currentSet; 

    distance_t insertDistance; 
    insertDistance.id =1; 
    insertDistance.distance = 0.5; 

    currentSet.insert(insertDistance); 

    distance_t findDistance; 
    findDistance.id = 1; 

    assert(currentSet.find(findDistance) != currentSet.end()); 
} 

यह हमेशा ज़ोर बयान में विफल रहता है के कोड है। मैं क्या गलत कर रहा हूं?

संपादित करें- अब मैं समझता हूं कि यह == ऑपरेटर का उपयोग नहीं करता है। मैं यही चाहता हूं। मुझे दूरी से आदेश देने के लिए डेटा संरचना की आवश्यकता है। लेकिन मैं आईडी का उपयोग कर इसे हटाने में सक्षम होना चाहिए। क्या ऐसा करने के लिए कोई साफ तरीका है या पहले से ही मौजूदा डेटास्ट्रक्चर है?

+2

एक शैली का सुझाव: जहां आपके पास 'if (expr) सत्य है; अन्यथा झूठी वापसी; 'आप बस' वापसी expr; ' – Blastfurnace

+1

बस 'वापसी आईडी

+0

@ ब्लास्टफर्नेस आपको या तो ब्रांड्स की आवश्यकता नहीं है। –

उत्तर

8

यह विफल रहता है, क्योंकि आपके तुलना से कम distance_t::distance का उपयोग करता है, जो आपको findDistance में स्थापित करने के लिए नहीं कर रहे हैं:

distance_t findDistance; 
findDistance.id = 1; 

std::set कुछ भी operator== उपयोग नहीं करता। यह केवल operator< का उपयोग करता है। इसलिए आपको distance_t::id का उपयोग करने के लिए इसका तर्क बदलना होगा।

आप सेट के आदेश देने के बदले बिना id द्वारा खोज करना चाहते हैं, तो आप std::find उपयोग कर सकते हैं:

set<distance_t>::iterator it = std::find(currentSet.begin(), 
             currentSet.end(), 
             findDistance); 

यह आपके operator== का प्रयोग करेंगे। ध्यान रखें कि इसमें रैखिक समय जटिलता है।

+0

मैं तत्वों को ऑर्डर करने के लिए दूरी का उपयोग करना चाहता हूं लेकिन आईडी को तत्व ढूंढना चाहता हूं। क्या यह बिल्कुल संभव है? –

+1

@TheFlyingDutchman ऑर्डरिंग का उपयोग लुक-अप के लिए किया जाता है (सेट एक बाइनरी पेड़ है)। इसलिए आदेश और लुकअप को रद्द करना संभव नहीं है। आप ऑर्डरिंग तर्क में 'id' को शामिल कर सकते हैं, यह वास्तव में उस पर निर्भर करता है जिसे आप प्राप्त करने का प्रयास कर रहे हैं। – juanchopanza

+1

@TheFlyingDutchman आप 'ऑपरेटर <' पहले दूरी पर देख सकते हैं, और यदि वे बराबर हैं, तो आईडी देखें। वह ऑर्डर सुरक्षित रखेगा जिसे आप ढूंढ रहे हैं। (और दोनों फ़ील्ड को देखने के लिए 'ऑपरेटर ==' भी बदलें।) लेकिन इसका मतलब यह है कि यदि आप केवल आईडी रखते हैं तो आप खोज नहीं सकते हैं। – hvd

4

क्योंकि operator== बिल्कुल भी नहीं बुलाया जाता है।

!(a < b) && !(b < a) 

दूसरे शब्दों में, यह operator< उपयोग करता है: तत्वों की तुलना की तरह है।

1

जैसा कि आपने findDistance.distance पर कोई मान निर्दिष्ट नहीं किया है, तो कम परिणाम का परिणाम अपरिभाषित है।

ध्यान दें कि समानता की कम परिभाषाएं और तुलनात्मक ऑपरेटर कम परिभाषा खतरनाक है, क्योंकि distance_t के उदाहरणों को परिभाषित करना आसान है जहां उनका परिणाम असंगत है। एक उदाहरण एक ही दूरी के साथ दो उदाहरण हैं लेकिन अलग-अलग आईडी है।

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