Как я могу написать компаратор с промежуточной переменной для сортировки STL - PullRequest
1 голос
/ 01 декабря 2011
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);

Но я НЕ МОГУ использовать статическую эталонную точку для безопасной многопоточности, есть ли другой способ ??Благодаря.

Ответы [ 4 ]

3 голосов
/ 01 декабря 2011

Сделать его частью 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));
1 голос
/ 01 декабря 2011

Избегайте глобальных переменных.Это начало написания многопоточного кода.

Вместо этого используйте локальные переменные:

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

points.sort(Comparator(referencePoint));

Или просто:

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

, где Comparator является функтор определяется как:

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().Это делает класс функтором.

1 голос
/ 01 декабря 2011

Почему бы просто не сохранить referencePoint или, скорее, целочисленное значение внутри Point как элемент внутри вашего Comparator, чтобы вы всегда обращались к нему в функции компаратора.

0 голосов
/ 01 декабря 2011

Вы можете просто сохранить эту переменную либо в деструктурированном, либо в структурированном виде.

// 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 не хороши в этом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...