2011-12-01 17 views
1
class Point  
{  
    int x; 
}  
static Point referencePoint; 
struct Comparator 
{ 
    bool AbsComparator(const Point& p1, const Point& p2) 
    {  
     return abs(p1.x - referencePoint.x) < abs(p2.x - referencePoint.x); 
    } 
};  
list<Point> points; 
points.sort(Comparator::AbsComparator); 

但我不能使用一个静态的referencePoint多线程安全,有没有其他方式? 谢谢。我怎样才能写一个中间变量为stl比较器

+1

如果您的referencePoint被用作只读确定您可以 – akappa

+0

您可以使用[thread-local storage](http://en.wikipedia.org/wiki/) Thread-local_storage)(TLS)。 –

回答

3

使一部分Comparator

struct Comparator 
{ 
    Point referencePoint; 

    Comparator(Point referencePoint): referencePoint(referencePoint) {} 

    Comparator(const Comparator& rhs) { 
     referencePoint = rhs.referencePoint; 
    } 

    bool operator()(const Point& p1, const Point& p2) const 
    {  
     return abs(p1.x - referencePoint.x) < abs(p2.x - referencePoint.x); 
    } 
};  

... 

points.sort(Comparator(refP)); 
+0

最好使'operator()'为const函数! – Nawaz

+1

另外,复制构造函数不是必需的。编译器生成一个就足够了。 – Nawaz

1

为什么不里面PointreferencePoint或者说整数值只需保存为成员的Comparator里面,这样你总是访问它的比较器功能。

1

避免全局变量。这是编写多线程代码的开始。

使用局部变量来代替:

Point referencePoint(10,20); //use local variable! 

points.sort(Comparator(referencePoint)); 

或者一个SimPy此,

points.sort(Comparator(Point(10,20))); 

其中Comparatorfunctor定义为:

struct Comparator 
{ 
    Point referencePoint; 

    explicit Comparator(const Point & pt) : referencePoint(pt) {} 

    bool operator() (const Point& p1, const Point& p2) const 
    {  
     return abs(p1.x - referencePoint.x) < abs(p2.x - referencePoint.x); 
    } 
};  

大功告成!

注意执行operator()。这使得这个类成为一个函子。

+0

pssst:'显式'。 –

+0

@MatthieuM:在这种情况下,我没有看到'explicit'的任何优点,是吗? – Nawaz

+0

我没有看到任何隐含的优势。这不是那种罕见的情况下写一个新的数字类。默认情况下,我倾向于将所有“单参数”构造函数编写为“显式”。至少我会收到通知,如果它被隐式使用,而相反是不正确的:) –

0

您可以简单地以解构或结构化的方式存储此变量。

// destructured (only store what you need) 
class ReferenceComparator { 
public: 
    explicit ReferenceComparator(int x): _x(x) {} 
    explicit ReferenceComparator(Point const& p): _x(p.x) {} 

    bool operator()(Point const& left, Point const& right) const { 
    return abs(left.x - _x) < abs(right.x - _x); 
    } 

private: 
    int _x; 
}; // class ReferenceComparator 

,然后用它作为:

list.sort(ReferenceComparator(myReferencePoint)); 

我不会使用list如果需要排序通过建议。 list不擅长它...

相关问题