IIUC, вы имеете дело с диапазонами, и у вас есть инвариант на карте, диапазоны которого не перекрываются.Если это так, вы должны определить свой оператор <так, чтобы он работал с диапазонами и делал что-то радикальное (ошибка утверждения или исключение) в случае наложения, чтобы предотвратить вставку таких диапазонов.Принимая наполовину открытый диапазон [low, high) и утверждение, что high> = low в конструкторе Interval, должно работать что-то вроде следующего:
struct CmpInterval
{
// For insertion...
bool operator<( Interval const& lhs, Interval const& rhs) const
{
assert( lhs.low >= rhs.high
|| lhs.high <= rhs.low
|| (lhs.low == rhs.low && lhs.high == rhs.high) );
return lhs.low < rhs.low;
}
// For find, lower_bound, etc.
bool operator<( Interval const& lhs, int target ) const
{
return lhs.low < target;
}
bool operator<( int target, Interval const& rhs ) const
{
return target <= rhs.high;
}
};
Последние два используются для lower_bound, findи т. д., когда вы передаете простое целое число в качестве ключа (а не интервал);вместе они определяют строгие отношения упорядочения между int и Inteval, IFF нет перекрывающихся интервалов и отношение эквивалентности, так что все n в интервале [i, j) эквивалентны этому диапазону идруг другу.(Опять же, если есть перекрывающиеся интервалы, отношения эквивалентности не существует, и поведение не определено.)