2011-12-16 60 views
5

我正在嘗試用C++語言編寫一個程序。如何用std :: set包含我的類

類邊緣指示ù之間的連接和v。

邊緣一指示,其指示V和U之間的連接u和v。一個邊緣」之間的連接。邊a和'表示相同的連接。所以,我想包含一個或一個'。

我知道「集合」存儲獨特的元素。所以我想用這個。我在下面定義了運算符<。

當我搜索錯誤時,我發現了一些錯誤。 (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) – 2011-12-16 05:25:47

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); } 

如果兩個邊都應該是「等效」,那麼就可以更容易,更緊張的把它記錄在「規範'這樣的格式。

另一個問題是,您正在測試的是平等,而不是像其他人所解釋的那樣。