vector中的erase方法效率是很低的,因为为了保持vector中元素在内存空间中的连续性,在删除某个元素之后,需要将其后的元素依次向前移动一个位置,平均复杂度为o(n)。
gcc 下erase的实现如下:
iterator erase(iterator position)
{
if (position + 1 != end())
copy(position + 1, finish, position); // 后续元素往前移动
--finish;
destroy(finish); // 一个释放资源的全局函数
return position;
}
今天在去除停用词的时候就遇上了这个问题,慢慢调试,发现就是在erase这个地方花费了大量时间。
解决办法:
如果要删除了元素在最后一个位置,则不需要移动其他元素,只需要o(1)的时间开销,基于这种思想,可以实现一种高效的vector中删除元素的方法
for(int i=0; i<vec.size(); )
{
if( some condition )
{
swap( vec[i], vec[vec.size()-1] );
vec.pop_back();
}
else
{
i ++ ;
}
}