Вот решение, которое мне удалось получить.
Ключ на самом деле <unsigned int, unsigned int>
, при упорядочении относительно ролловера необходимо учитывать только первое значение ключа.
Кроме того, идентификатор равен 1, поэтому значения будут 1, 2, ..., N, 1, 2, ...
Наконец, обратите внимание, что MAX ID достаточно велик, чтобы у нас никогда не было нескольких одинаковых ключей, пытающихся одновременно существовать на карте. То есть к моменту, когда мы добираемся до идентификатора N, начальные ключи 1, 2, 3 ... уже давно ушли.
class Mykey(
public:
unsigned int Id1;
unsigned int Id2;
MyKey(unsigned int k1, unsigned in k2)
: Id1(k1), Id2(k2) {}
bool operator<(const MyKey &rhs) const
{
if (Id1 == rhs.Id1)
return Id2 < rhs.Id2;
else if ( (rhs.Id1 > Id1) && (rhs.Id1 - Id1 > MAX_ID/2) )
return false;
else if ( (Id1 > rhs.Id1) && (Id1 - rhs.Id1 > MAX_ID/2) )
return true;
else
return Id1 < rhs.Id1;
}
Скажем, MAX_ID равен 25, первый - если рассматривается случай, когда rhs.Id1 - 25, а Id1 - 1. Второй - рассматривает противоположный случай с Id1 = 25 и rhs.Id1 = 1. MAX_ID / 2 проверяет, что два значения находятся «далеко друг от друга», что указывает на перенос идентификатора.