2013-04-28 57 views
5

此定義的OuterClass裏面比較對象:C++ STL集合:與外在狀態

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

我的問題是比較功能operator()取決於OuterClass狀態。 (MySet實例進行優化的算法時使用,他們在不同的階段以不同的排序。)

有什麼辦法/解決方法比較功能operator()內訪問OuterClass非靜態成員?

回答

5

是否有任何方式/解決方法來訪問compare函數運算符()內的OuterClass的非靜態成員?

有。只要寫一個用戶定義的構造函數Compare接受並存儲到OuterClass參考,這種方式:

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

然後,當你創建你的設置,你可以這樣做:

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 
} 

當心不過:排序標準應該保持穩定。元素必須總是比較相同的集合。每一段的C++ 11標準的23.2.4/3:

短語「鍵的等價」是指通過比較施加的等價關係,而不是 operator==上的按鍵。也就是說,如果用於比較 對象comp,comp(k1, k2) == false && comp(k2, k1) == false,則兩個鍵​​和k2被認爲是等同的。 對於 相同容器中的任意兩個鍵k1和k2,調用comp(k1, k2)應始終返回相同的值

+0

啊,我忘了看設置的構造函數,所以我沒有認識到我可以創建自己的比較對象。感謝關於C++ 11標準的提示 - 我牢記這一點:)非常感謝! – schoettl 2013-04-28 09:45:51

+0

@ user999007:不客氣,祝你的項目好運;) – 2013-04-28 09:52:23