std::vector::erase 对比 "swap and pop"
std::vector::erase vs "swap and pop"
从向量中删除元素的"normal"方法是这样的:
vec.erase(vec.begin() + index);
但理论上这样做会更快:
if (vec.size() > 1)
{
std::iter_swap(vec.begin() + index, vec.end() - 1);
vec.pop_back();
}
else
{
vec.clear();
}
有什么理由不使用后者吗?
第二种情况不保留向量中元素的顺序。如果这是一个排序的向量或者顺序很重要,那么你刚刚在第二种情况下打破了它,而第一种情况会使顺序保持不变。
从向量中删除元素的"normal"方法是这样的:
vec.erase(vec.begin() + index);
但理论上这样做会更快:
if (vec.size() > 1)
{
std::iter_swap(vec.begin() + index, vec.end() - 1);
vec.pop_back();
}
else
{
vec.clear();
}
有什么理由不使用后者吗?
第二种情况不保留向量中元素的顺序。如果这是一个排序的向量或者顺序很重要,那么你刚刚在第二种情况下打破了它,而第一种情况会使顺序保持不变。