Что было бы самым изящным, слишком исправляют следующий код:
#include <vector>
#include <map>
#include <set>
using namespace std;
typedef map< int, int > row_t;
typedef vector< row_t > board_t;
typedef row_t::iterator area_t;
bool operator< ( area_t const& a, area_t const& b ) {
return( a->first < b->first );
};
int main( int argc, char* argv[] )
{
int row_num;
area_t it;
set< pair< int, area_t > > queue;
queue.insert( make_pair( row_num, it ) ); // does not compile
};
Один способ зафиксировать его перемещает определение меньше <к станд. пространства имен (я знаю, Вы, как предполагается, не делаете это.)
namespace std {
bool operator< ( area_t const& a, area_t const& b ) {
return( a->first < b->first );
};
};
Другое очевидное решение определяет меньше, чем <для пары <интервал, area_t>, но я хотел бы избежать, что и смочь определить оператор только для одного элемента пары, где это не определяется.
Когда вы реализуете компаратор, который реализует какой-то специфический и/или довольно экзотический подход к сравнению, лучше использовать именованную функцию или объект функции вместо того, чтобы использовать для этой цели оператор <
. Я бы сказал, что естественным способом сравнения объектов std::pair
было бы использование лексикографического сравнения. Поскольку ваше сравнение не является лексикографическим, использование оператора <
может быть не очень хорошей идеей. Лучше реализовать класс компаратора
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
-базированных типов с итератором в качестве второго
члена. Однако это может не иметь большого смысла, поскольку ваше сравнение достаточно "экзотично".