Let's say I have a std::map<int, std::string> myMap
containing the data
1. Red
2. Blue
3. Green
5. Fuchsia
6. Mauve
9. Gamboge
10. Vermillion
and also an std::map<int, std::string>::iterator it
pointing at the element
5. Fuchsia
I would like to do something like (making this up)
std::map<int, std::string> myHead = eject(myMap, myMap.begin(), it);
which would result in myMap
containing
5. Fuchsia
6. Mauve
9. Gamboge
10. Vermillion
and myHead
containing
1. Red
2. Blue
3. Green
I could accomplish this by doing something like
std::map<int, std::string> myHead;
myHead.insert(myMap.begin(), it);
myMap.erase(myMap.begin(), it);
but this seems suboptimal in at least some cases, e.g. if I pick a point such that I'm just splitting off a subtree. (I'll admit that I haven't actually thought through the actual details of the algorithmic complexity here, but if we imagine a case where the value type is extraordinarily expensive to copy then it's clear that the above can't be optimal in general.)
Question: is there a way that I can get std::map
to perform this operation in an optimal manner, or do I have to write my own binary search tree where I have access to the internals to accomplish this?
extract
operates on a single node (without bringing along the nodes underneath it), so it seems like any solution based on that would necessarily be at least O(m), where m is the number of elements in the piece being split off. And I don't see a use formerge
at all here. – Underscore