Когда вы реализуете компаратор, который реализует некоторый специфический и / или довольно экзотический подход сравнения, лучше использовать именованную функцию или объект функции вместо того, чтобы перехватить operator <
для этой цели. Я бы сказал, что естественным способом сравнения объекта std::pair
было бы использование лексикографического сравнения. Поскольку ваше сравнение не лексикографическое, взятие operator <
может быть не очень хорошей идеей. Лучше реализовать класс компаратора
typedef pair< int, area_t > Pair; // give it a more meaningful name
struct CompareFirstThroughSecond {
bool operator ()(const Pair& p1, const Pair& p2) const {
if (p1.first != p2.first) return p1.first < p2.first;
return p1.second->first < p2.second->first;
}
};
и используйте его с вашим контейнером
std::set< Pair, CompareFirstThroughSecond > queue;
(надеюсь, я правильно расшифровал ваше намерение из исходного кода).
Вы также можете реализовать описанный выше метод operator ()
как шаблонный метод, что делает его пригодным для использования со всеми типами на основе std::pair
с итератором в качестве члена second
. Это может не иметь никакого смысла, поскольку ваше сравнение достаточно «экзотично».