2013-10-21 57 views
1

我需要幫助能夠在運行時定義自定義std :: set比較器。我知道如何定義一個固定值的基本比較器。我真的被困在如何在運行時做到這一點。如果有幫助,我正在運行Visual Studio 2010。在運行時定義自定義比較器std :: set

下面是我的代碼:

#include <set> 

struct CustomComp 
{ 
    CustomComp():m_tolerance(0.1){} 

    //Always assume tolerance >= 0.0 
    CustomComp(double const &tolerance):m_tolerance(tolerance){} 

    /*Only return true when the two number are sufficiently apart from each other*/ 
    bool operator()(double const &n1, double const &n2) 
    { 
     double diff = n1 - n2; 
     if(diff < 0.0 && std::abs(diff) > m_tolerance) return true; 
     if(diff > 0.0 && std::abs(diff) > m_tolerance) return false; 

     return false; 
    } 
private: 
    double m_tolerance; 
}; 


int main(int argc, char **argv) 
{ 
    /*This works */ 
    std::set<double, CustomComp> aaa; 
    aaa.insert(0.0); 
    aaa.insert(0.2); 
    aaa.insert(0.3); 
    aaa.insert(10.0); 

    /*What I really want*/ 
    double tol = GetToleranceFromUser(); 
    std::set<double, CustomComp(tol)> bbb; 

     return 0; 
} 

謝謝。

回答

6

比較被作爲參數傳遞給集合構造:

std::set<double, CustomComp> bbb(CustomComp(tol)); 
+0

謝謝。我一直在閱讀std :: set文檔,並且這些時候我的眼前的答案是正確的。不知何故,我的大腦沒有把它拿起來。 – nightcom26