您的位置:首页 > 其它

erase删除后移动元素改进算法

2012-11-22 13:01 204 查看
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 ++ ;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: