更新排序向量的一个条目

Updating one entry of a sorted vector

本文关键字:一个 排序 向量 更新      更新时间:2023-10-16

>假设我有一个名为 v 的排序std::vector<int>。我增加了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。(不确定它是否可以轻松做到这一点。如果已回答,请道歉;搜索未找到答案。

使用 std::rotate 将元素移动到其新位置。 如果你真的认为它不会走得太远,线性搜索新位置可能会更快(或者通过检查与旧位置的加倍距离来应用混合方法,以找到upper_bound的边界(。

你不应该erase,然后在不需要的时候insert元素。如果在迭代器pos增加元素,则只需找到插入和旋转元素的位置:

 auto new_pos = std::lower_bound(pos,end,*pos);
 std::rotate(pos,pos+1,new_pos);
相关文章: