2013-04-28 25 views
5

định nghĩa này là bên trong OuterClass:C++ STL bộ: So sánh đối tượng với trạng thái bên ngoài

struct Compare 
{ 
    bool operator()(const T&, const T&); 
}; 
typedef set<T, Compare> MySet; 

Vấn đề của tôi là so sánh chức năng operator() phụ thuộc vào tình trạng OuterClass. (MySet trường hợp được sử dụng trong một thuật toán cho việc tối ưu và họ phải sắp xếp khác nhau ở các giai đoạn khác nhau.)

Có cách nào/workaround để truy cập các thành viên không tĩnh của OuterClass từ bên trong so sánh chức năng operator()?

Trả lời

5

Có cách nào/giải pháp khác để truy cập các thành viên không phải của OuterClass từ bên trong toán tử hàm so sánh() không?

Có. Chỉ cần viết một constructor người dùng định nghĩa cho Compare chấp nhận và lưu trữ một tham chiếu đến OuterClass, theo cách này:

struct Compare 
{ 
    Compare(OuterClass& o) : oc(o) { } 
    bool operator()(const T&, const T&) 
    { 
     // Uses oc somehow... 
    } 
private: 
    OuterClass& oc; 
}; 

Sau đó, khi bạn tạo thiết lập của bạn, bạn có thể làm điều gì đó như:

int main() 
{ 
    typedef std::set<T, Compare> MySet; 

    OuterClass oc; // <== Construct an object of type Outerclass somehow... 

    MySet ms(Compare(oc)); // <== Construct your comparator and pass it 
          //  in input to the constructor of std::set 
} 

Hãy coi chừng Mặc dù: tiêu chí đặt hàng sẽ vẫn ổn định. Các phần tử phải luôn luôn giống nhau cho cùng một tập hợp. Mỗi đoạn 23.2.4/3 của C++ 11 Tiêu chuẩn:

Cụm từ “tương đương phím” có nghĩa là quan hệ tương đương áp đặt bởi sự so sánh và không phải là operator== trên phím. Tức là, hai phím k1k2 được coi là tương đương nếu đối chiếu đối tượng comp, comp(k1, k2) == false && comp(k2, k1) == false. Đối với bất kỳ hai khóa k1 và k2 nào trong số vùng chứa giống nhau, hãy gọi comp(k1, k2) sẽ luôn trả về cùng một giá trị.

+0

Ah, tôi quên nhìn vào các nhà xây dựng thiết lập, vì vậy tôi đã không nhận ra rằng tôi có thể tạo đối tượng so sánh bằng của riêng tôi. Cảm ơn bạn đã tip về tiêu chuẩn C++ 11 - Tôi lưu ý điều này :) Cảm ơn rất nhiều! – schoettl

+0

@ user999007: Bạn được chào đón, chúc bạn may mắn với dự án của mình;) –

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