我想知道什么是最高效的(最快,因为向量并不大,我不在乎内存使用)在下面执行此操作:
在不改变矢量大小的情况下, 移除向量的前x个元素,将其余元素推到第一个元素,并为后x个元素分配新值。我猜vector :: erase和:: push_back可能不是很快,因为它两次更改了向量的大小。
还是放弃向量并使用数组更好?谢谢。
答案 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; });
}
答案 1 :(得分:0)
vector::erase()
不会重新分配,它只会在已分配的容量内移动内容并调整大小。 (请注意,编辑:这与这种情况并不相关。)erase()
不会抛出bad_alloc
,仅会复制/移动/分配异常。
因此,调用erase()
的效率应该不低于调用rotate()
的效率。
erase()
可能会更高效,因为rotate()
不仅会移动您要保留的特定情况下的数据,还会移动您将要丢弃的数据-而且rotate()
所规定的语义也必须保留(这反过来可能需要临时存储或一对一移动)。您可以希望优化器设法解决此问题,也可以致电erase()
。
当然,唯一可以说的就是实现,衡量和比较。