将向量元素移动到向量的后面

Moving a vector element to the back of the vector

本文关键字:向量 移动 元素      更新时间:2023-10-16

是否有比删除元素并将其重新添加到后面更好的方法(更快或更少的代码符号)?

template <typename T>
void moveItemToBack(std::vector<T>& v, size_t itemIndex)
{
   T tmp(v[itemIndex]);
   v.erase(v.begin() + itemIndex);
   v.push_back(tmp);
}

您可以使用标准库中的std::rotate完成此操作。因为这不会改变向量的大小,所以也不会触发重新分配。你的函数看起来像这样:

template <typename T>
void moveItemToBack(std::vector<T>& v, size_t itemIndex)
{
    auto it = v.begin() + itemIndex;
    std::rotate(it, it + 1, v.end());
}

最快的方法可能是将它与最后一个元素

交换
template <typename T>
void moveItemToBack(std::vector<T>& v, size_t itemIndex)
{
   std::swap(v[itemIndex], v.back()); // or swap with *(v.end()-1)
}

一个操作!当然std::swap必须与T一起工作

你可以避免额外的变量

v.push_back(v[itemIndex]);
v.erase(v.begin() + itemIndex);

如果你经常从向量的中间删除,并且可以重写你的代码,使它不需要随机访问,你可以通过使用链表(std::list)来提高效率。