std :: map будет сравнивать тип, который вы даете ему как ключ (vertex*
), но вы определяете оператор <
для вершины.
Вы можете использовать структуру как ключи, или- если вам нужно использовать указатели - вы должны дать карте способ сравнить указатели.
Теперь std::map
использует std::less
в качестве предиката сравнения, который определен в термине <
(поэтому, используя саму структуру, вы можете достичь результата, перегрузив <
).
Вы можете либо:
o) определить себе предикат, который сравнивает вершину *: он можетбыть
template <class T> //assume T is a pointer or pointer-like class
struct redirected_less : public std::binary_function <T,T,bool>
{
bool operator() (const T& x, const T& y) const {return *x < *y;}
};
и затем определить вашу карту как
std::map<vertex*, vector<vertex*>, redirected_less<vertex*> >
o) специализировать std :: less для вершины * как
namespace std
{
template <>
struct less<vertex*> : binary_function <vertex*,vertex*,bool>
{
bool operator() (vertex* x, vertex* y) const {return *x < *y; }
};
}
и объявить вашу картукак
std::map<vertex*, vector<vertex*> >
как обычно.
Я лично предпочитаю первое (дает более локализованный код, меньше "загадочного" в будущих чтениях)