Вам нужно определить порядок пунктов Point.
Это можно сделать разными способами:
Перегрузить operator <
для Point
Вы можетеобеспечить перегрузку оператора <
, прототип которого:
bool operator < (const Point & p_lhs, const Point & p_rhs) ;
Например, для своих тестов я использовал следующий:
bool operator < (const Point & p_lhs, const Point & p_rhs)
{
if(p_lhs.getX() < p_rhs.getX()) { return true ; }
if(p_lhs.getX() > p_rhs.getX()) { return false ; }
return (p_lhs.getY() < p_rhs.getY()) ;
}
Это самый простой способ, но семантически предполагается, что определенный выше порядок является правильным по умолчанию .
Предоставление функтора
Если вы не желаете предоставлять оператор <
или вы хотите иметь несколько карт, каждая из которых имеет свой собственный порядок, ваше решение заключается в предоставлении функтора для карты.Это третий параметр шаблона, определенный для карты:
template < class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key,T> > > class map;
Функтор должен иметь следующую подпись:
struct MyCompareFunctor
{
bool operator() (const Point & p_lhs, const Point & p_rhs)
{
// the code for comparison
}
} ;
Итак, для моих тестов я просто написал следующее:
struct MyCompare
{
bool operator() (const Point & p_lhs, const Point & p_rhs)
{
if(p_lhs.getX() > p_rhs.getX()) { return true ; }
if(p_lhs.getX() < p_rhs.getX()) { return false ; }
return (p_lhs.getY() > p_rhs.getY()) ;
}
} ;
И использовал его на моей карте:
std::map<Point, Point, MyCompare> map ;
Et voilà ...
Специализируясь std::less
для Point
Я не вижу смысла в этом, но всегда полезно знать: вы можете специализировать std::less
структуру шаблона для вашего Point
класса
#include <functional>
namespace std
{
template<>
struct less<Point> : binary_function <Point,Point,bool>
{
bool operator() (const Point & p_lhs, const Point & p_rhs)
{
if(p_lhs.getX() < p_rhs.getX()) { return true ; }
if(p_lhs.getX() > p_rhs.getX()) { return false ; }
return (p_lhs.getY() < p_rhs.getY()) ;
}
} ;
}
Это имеет тот же эффект, что иперегрузка operator <
, по крайней мере, что касается карты.
Что касается решения operator <
, приведенного выше, семантически, это решение предполагает, что порядок, определенный выше, является правильным по умолчанию, посколькуstd:less
.
Обратите внимание, что реализация по умолчанию std::less
вызывает operator <
типа шаблона.Наличие одного результата, отличного от другого, может рассматриваться как семантическая ошибка.