Vio*_*ffe 9 c++ vector stdvector
有没有更好的方法(更快或代码更少的符号)比擦除元素并重新添加到后面?
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);
}
Run Code Online (Sandbox Code Playgroud)
Bla*_*ace 34
您可以使用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());
}
Run Code Online (Sandbox Code Playgroud)
可能是最快的方法,就是将它与最后一个元素交换
template <typename T>
void moveItemToBack(std::vector<T>& v, size_t itemIndex)
{
std::swap(v[itemIndex], v.back()); // or swap with *(v.end()-1)
}
Run Code Online (Sandbox Code Playgroud)
一次操作!Ofcourse std::swap必须与之合作T
您可以避免额外的变量。
v.push_back(v[itemIndex]);
v.erase(v.begin() + itemIndex);
Run Code Online (Sandbox Code Playgroud)
如果您经常从向量中间删除并且可以重写您的代码使其不需要随机访问,您可以通过使用链表 ( std::list)来提高效率。
| 归档时间: |
|
| 查看次数: |
17667 次 |
| 最近记录: |