2011-12-16 25 views
5

Tôi đang cố gắng viết một chương trình bằng ngôn ngữ C++.Làm thế nào để chứa lớp học của tôi với std :: set

Lớp Cạnh chỉ ra mối liên hệ giữa u và v.

cạnh một mà chỉ ra mối liên hệ giữa u và v. Cạnh một' mà chỉ ra mối liên hệ giữa v và u. Cạnh a và một 'chỉ ra cùng một kết nối. Vì vậy, tôi muốn chứa một hoặc một '.

Tôi biết "đặt" lưu trữ các yếu tố độc đáo. Vì vậy, tôi muốn sử dụng điều này. Tôi xác định toán tử < bên dưới.

Khi tôi tìm kiếm lỗi, tôi đã tìm thấy một số trubles. Tôi lưu trữ (1,2) -> (1,2) -> (2,1) -> (3,2) -> (2,3) -> (5,2).

Nhưng thiết lập cửa hàng

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

Ông có thể giúp tôi ??

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

Trả lời

5

operator< của bạn đang thử nghiệm cho sự bình đẳng, không nhỏ hơn. Hãy thử:

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

Edit: Theo nhận xét tôi hiểu lầm câu hỏi - tập là nghĩa vụ phải từ chối một bản sao trong hoặc đặt hàng. Toán tử so sánh cần nhất quán, vì vậy đây là toán tử có thể hoạt động.

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

Cảm ơn bạn! Nhưng, tôi muốn chứa một (1,2) –

+0

@ user975352, 'bộ' thường sẽ loại bỏ các bản sao nhưng không thể nếu bạn không xác định toán tử' <'của bạn đúng cách. –

+1

Điều này không chính xác. @ user975352 không muốn (1,2), (2,1) đều nằm trong bộ – Shawnone

3

Thực hiện operator < thực hiện giống như thực hiện bình đẳng. hãy thử thực hiện từ vựng ít hơn triển khai:

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

Nhà điều hành của bạn < cần phải được tinh chỉnh. Nếu nó không đặt hàng một cách nhất quán, hãy đặt và lập bản đồ làm những điều xấu.

Hãy thử

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

Thêm mã sau đây trước khi trở lại của bạn. Lý do được kể bởi các câu trả lời khác.

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

Bạn nên xem xét thay đổi constructor Cạnh của bạn này:

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

Nếu hai cạnh có nghĩa vụ phải là "tương đương", sau đó nó có thể được dễ dàng hơn và ít căng thẳng để ghi lại nó trong một 'kinh điển 'Định dạng như thế này.

Vấn đề khác là bạn đang thử nghiệm bình đẳng, không nhỏ hơn, như được giải thích bởi những người khác.

Các vấn đề liên quan