有没有比擦除元素并将其重新添加到背面更好的方法(更快或代码更少的符号)?
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);
}
答案 0 :(得分:33)
您可以使用标准库中的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());
}
答案 1 :(得分:8)
可能是最快的方式,就是将它与最后一个元素交换
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
答案 2 :(得分:4)
您可以避免使用额外的变量。
v.push_back(v[itemIndex]);
v.erase(v.begin() + itemIndex);
如果您经常从向量中间删除并且可以重写代码以使其不需要随机访问,则可以通过使用链接列表(std::list
)来提高效率。 / p>