bool operator<(const interval& x, const interval& y)
{
if x.min < y.min return true;
if x.min > y.min return false;
return x_max < y.max;
}
tie(x.min, x.max) < tie(y.min, y.max)
What's wrong with x.min < y.min || (x. min == y.min && x.max < y. max)
If the requirement is “use std::map to store items but prevent adding items to the map if they have a particular relationship to existing map keys”, then this is a terrible solution - std::map like maps and dictionaries in all programming language is not designed for this - it should never be an error to add a value associated with a key to a map instance. Hacking the ordering to implement a requirement like this is brittle, obscure and strange.
If this were proposed as a solution to the problem “design a data structure to store values keyed by intervals that prevents overlapping intervals”, then I would mark it very low.
What would you do differently? I would also assert if any overlapping intervals were inserted - it’s an invariant of his data structure.
If it was static I would just sort and binary search, but if not this seems like a fine way to reuse the std::map.
These templates are designed for this kind of thing - make a custom comparator, document why it works, wrap it in a typedef.
gsliepen•6h ago
> Suppose we want to have a C++ map where the keys are disjoint
And then we do something that goes against the whole point of such a map:
> But what happens if we try to insert an interval which is not disjoint with those already in the map?
And the solution is:
> Implementation-wise, we just have to [throw an exception if we are] comparing partially overlapping intervals
Much more interesting would be to show how to implement a proper interval map.