2011-12-16 19 views
5

के साथ मेरी कक्षा को कैसे शामिल करें मैं सी ++ भाषा में एक प्रोग्राम लिखने की कोशिश कर रहा हूं।std :: set

क्लास एज यू के बीच संबंध को इंगित करता है और वी।

एज एक जो जो वी और यू के बीच संबंध को इंगित करता है यू और वी। एज एक 'के बीच संबंध को दर्शाता है। एज ए और ए 'एक ही कनेक्शन इंगित करता है। तो, मैं या तो एक या एक 'रखना चाहता हूँ।

मुझे पता है कि "सेट" अद्वितीय तत्वों को स्टोर करता है। तो मैं इसका इस्तेमाल करना चाहता हूं। मैं नीचे ऑपरेटर < परिभाषित करता हूं।

जब मैं बग खोजता हूं, तो मुझे कुछ ट्रबल मिलते हैं। मैं स्टोर (1,2) -> (1,2) -> (2,1) -> (3,2) -> (2,3) -> (5,2)।

लेकिन सेट भंडार

1 2 
5 2 
3 2 
1 2 <-- Why ???? 

क्या आप मेरी मदद कर सकते हैं ??

#include<iostream> 
#include<set> 

class Edge { 

private: 
    int u, v; 

public: 
    bool operator< (const Edge& e) const { 
    bool result = true; 
    if((u == e.u && v == e.v) || (v == e.u && u == e.v)) { 
     result = false; 
    } 
    return result; 
    } 

    std::pair<int, int> pair() const { 
    return std::pair<int, int>(u, v); 
    } 

    Edge(int u_, int v_) : u(u_), v(v_) {} 
}; 

int main(void) { 
    std::set<Edge> edge; 
    std::set<Edge>::iterator eit; 

    edge.insert(Edge(1,2)); // <-- (1,2) can be contained. 
    edge.insert(Edge(1,2)); // <-- (1,2) doesn't have to be contained. 
    edge.insert(Edge(2,1)); // <-- (2,2) doesn't have to be contained. 

    edge.insert(Edge(3,2)); // <-- (3,2) can be contained. 
    edge.insert(Edge(2,3)); // <-- (2,3) doesn't have to be contained. 
    edge.insert(Edge(5,2)); // <-- (5,2) doesn't have to be contained. 

    edge.insert(Edge(1,2)); // <-- (1,2) doesn't have to be contained. But edge contains this. Why? 

    for(eit = edge.begin(); eit != edge.end(); eit++) { 

    std::cout << (*eit).pair().first << " " << (*eit).pair().second << std::endl; 
    } 

    return 0; 
} 

उत्तर

5

आपका operator< समानता के लिए परीक्षण कर रहा है, कम से कम नहीं। प्रयास करें:

if (u < e.u) 
    result = true; 
else if (e.u < u) 
    result = false; 
else 
    result = (v < e.v); 

संपादित करें: टिप्पणी मैं सवाल गलत समझा के अनुसार - सेट या तो क्रम में एक नकली अस्वीकार करने के लिए माना जाता है। तुलना ऑपरेटर को सुसंगत होने की आवश्यकता है, इसलिए यहां एक ऐसा काम कर सकता है जो काम कर सकता है।

if (min(u,v) < min(e.u,e.v)) 
    result = true; 
else if (min(e.u,e.v) < min(u,v)) 
    result = false; 
else 
    result = (max(u,v) < max(e.u,e.v)); 
+0

धन्यवाद! लेकिन, मैं एक (1,2) –

+0

@ user975352 रखना चाहता हूं, 'सेट' सामान्य रूप से डुप्लिकेट हटा देगा लेकिन यह नहीं हो सकता है कि आप अपने '<' ऑपरेटर को सही तरीके से परिभाषित नहीं करते हैं। –

+1

यह सही नहीं है। @ user975352 नहीं चाहता (1,2), (2,1) सेट – Shawnone

3

आप operator < कार्यान्वयन अधिक एक समानता कार्यान्वयन की तरह है। कर शाब्दिक कार्यान्वयन की तुलना में कम प्रयास करें:

bool operator< (const Edge& e) const 
{ 
    return (u < e.u) || (u == e.u && v < e.v); 
} 
0

आपका ऑपरेटर < परिष्कृत करने की जरूरत है। यदि यह लगातार वस्तुओं का ऑर्डर नहीं करता है, तो खराब चीजें सेट करें और मैप करें।

प्रयास करें

bool operator< (const Edge& e) const { 
    return pair() < e.pair(); 
} 
0

अपनी वापसी से पहले कोड निम्नलिखित जोड़ें। अन्य उत्तरों द्वारा कारण बताया गया है।

if(result) 
{ 
    return u < e.u; 
} 
0

आप इस के लिए अपने एज निर्माता को बदलने पर विचार करना चाहिए: दो किनारों "बराबर" होना चाहिए रहे हैं

Edge(int u_, int v_) : u(u_), v(v_) { if (u>v) swap(u,v); } 

है, तो यह एक 'विहित में यह रिकॉर्ड करने के लिए आसान और कम तनावपूर्ण हो सकता है इस तरह के प्रारूप।

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

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