更新排序向量的一个条目
Updating one entry of a sorted vector
>假设我有一个名为 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);
相关文章:
- 根据另一个矢量对一个矢量进行排序
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 给定一个枢轴点,按照它们与枢轴点构成的角度递增顺序对一组点进行排序
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- 通过将其中一个模板更改为 muliset 后,我可以在 PBDS 排序集上使用计数功能<int>less_equal<int>
- 只对向量中的一个类成员进行排序,其他成员保持不变
- 为什么这个快速排序实现给出了一个奇怪的输出
- 使用迭代器进行合并排序中的一个缓冲区
- 使用C++对一个巨大文件中的文本行进行字典式外部排序
- 我想要一个改变数组快速排序的2个数字的函数
- 如何在一个巨大的文本文件中对整数进行排序
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?
- C++一个具有 2 个参数(___ _____,整数长度)的函数中的快速排序
- 努力将在一个函数中创建的数组传递到一个排序函数
- 在一个排序的列表中正好找到N个连续项
- 插入到一个排序的双链表c++中
- 将两个排序向量合并到一个排序向量中
- 我正在编写一个排序函数,以升序对字符类型列表进行排序,如果有任何交换,则返回计数次数
- 二进制搜索在一个排序列表与所有节点的结构体c++