Предположим, у меня есть сортировка std::vector<int>
с именем v
.Я увеличиваю значение v[i]
и хочу пересортировать вектор.Предположим, я ожидаю увеличения v[i]
только чуть-чуть.Следующее, конечно, неверно.
// (WRONG)
int x = v[i]; // the new v[i], that is
v.erase(v.begin() + i);
v.insert(
std::upper_bound(v.begin() + i, v.end(), x),
x
);
Это неправильно, потому что я перемещаю почти весь массив назад, когда я удаляю, и вперед, когда я вставляю, и я могу только немного увеличить v[i]
, что требует только перемещения нескольких записей.Другая мысль может быть:
int x = v[i]; // the new v[i], that is
if (/* new v[i] is > old v[i] */) {
size_t j = i + 1;
while (v[j] < x && j < v.size()) {
std::swap(v[j-1], v[j])
j++;
}
}
и аналогично, если я уменьшил v[i]
вместо того, чтобы увеличить его.Это лучшее?
Предположим, у меня нет доступа к boost::flat_set
.(Не уверен, может ли это сделать это легко или нет.) Извиняюсь, если на это был дан ответ;поиск не нашел ответа.