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 ++ ;
}
}
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 ++ ;
}
}
相关文章推荐
- remove/remove_if算法配合容器的erase方法实现容器删除元素功能
- effective stl:如果确实需要删除元素,则需要在remove这一类算法之后调用erase
- vector删除元素erase和通用算法remove
- 如何从vector里删除元素(erase的副作用)
- 为什么vector的remove_if实际上并没有删除元素,而要配合erase使用
- 顺序表应用1:多余元素删除之移位算法
- 顺序表应用1:多余元素删除之移位算法
- 【3324】顺序表应用1:多余元素删除之移位算法
- 顺序表应用1:多余元素删除之移位算法
- sdut oj3324 顺序表应用1:多余元素删除之移位算法
- 顺序表应用1:多余元素删除之移位算法
- STL中用ERASE()方法遍历删除元素
- STL中用erase()方法遍历删除元素
- 顺序表应用1:多余元素删除之移位算法
- STL中用ERASE()方法遍历删除元素
- c语言:【顺序表】静态顺序表的删除指定位置元素Erase、删除指定元素Remove
- vector中使用erase删除元素
- 顺序表应用1:多余元素删除之移位算法
- 算法训练 删除数组零元素
- STL中用erase()方法遍历删除元素