struct TempRange {
int left = 0, right = 0, server = 0;
}
struct TempRanges
{
TempRange data[6]; // с запасом на один, реально нужно пять
int size = 0;
void add(int left, int right, int server);
// напишешь с обработкой пустых диапазонов и правильной склейкой?
// Обрабатывать будем только слева направо
void add(iterator) { add(iterator->first, iterator->second.right, iterator->second.server); }
}
// Вот мы получили it
TempRanges tmp;
iterator itLeft = it;
if (itLeft != map.begin()) {
--itLeft;
tmp.add(itLeft);
}
tmp.add(it->first, left - 1, from);
tmp.add(left, right, to);
tmp.add(right + 1, it->second.right, from);
iterator itRight = it;
++itRight;
if (itRight != map.end()) {
tmp.add(itRight);
++itRight;
}
// Пошла замена, ломать можно только [itLeft, itRight)
it = itLeft;
for (int i = 0; i < tmp.size(); ++tmp) {
TempRange& range = tmp.data[i];
// Удалим лишнее
while (it != itRight && it->first < range.left) {
auto it2 = it;
++it;
map.erase(it2);
}
// Заменим/добавим
if (it != itRight && it->first == range.left) {
it->second.right = range.right;
it->second.server = range.server;
} else {
++it;
// Вставка с хинтом, немного выиграет!
it = map.emplace_hint(it, range.left, ValueType { range.right, range.server } );
++it;
}
}
// Удалим остаток
map.erase(it, itRight);
vector<unique_ptr<>>
.