C ++删除前x个元素的有效方法,将第x + 1个元素推到第一个而不更改矢量大小

时间:2019-11-18 09:48:29

标签: c++ vector

我想知道什么是最高效的(最快,因为向量并不大,我不在乎内存使用)在下面执行此操作:

在不改变矢量大小的情况下, 移除向量的前x个元素,将其余元素推到第一个元素,并为后x个元素分配新值。我猜vector :: erase和:: push_back可能不是很快,因为它两次更改了向量的大小。

还是放弃向量并使用数组更好?谢谢。

2 个答案:

答案 0 :(得分:0)

因此,根据您的评论并根据@Some程序员的建议,这可以满足您的要求:

#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    vector<int> vec{1,2,3,4,5,6,7,8};
    const size_t X = 3;
    std::rotate(vec.begin(), vec.begin() + X, vec.end());
    std::transform(vec.end() - X, vec.end(), vec.end() - X, [](auto elem) {return elem += 10; });
}

Demo

答案 1 :(得分:0)

vector::erase()不会重新分配,它只会在已分配的容量内移动内容并调整大小。 (请注意,erase()不会抛出bad_alloc,仅会复制/移动/分配异常。编辑:这与这种情况并不相关。)

因此,调用erase()的效率应该不低于调用rotate()的效率。

实际上,

erase()可能会更高效,因为rotate()不仅会移动您要保留的特定情况下的数据,还会移动您将要丢弃的数据-而且rotate()所规定的语义也必须保留(这反过来可能需要临时存储或一对一移动)。您可以希望优化器设法解决此问题,也可以致电erase()

当然,唯一可以说的就是实现,衡量和比较。