有两种方法可以用来特别擦除一个项目。
让我们取一个向量
std :: vector < int > v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(40);
v.push_back(50);
1) 非高效方式: 虽然看起来非常高效,但这并不是因为擦除功能会删除元素并将所有元素向左移动 1。
所以它的复杂度将是 O(n^2)
std :: vector < int > :: iterator itr = v.begin();
int value = 40;
while ( itr != v.end() )
{
if(*itr == value)
{
v.erase(itr);
}
else
++itr;
}
2) 高效方式(推荐):又称ERASE - REMOVE idioms。
- std::remove 将给定范围转换为一个范围,其中所有比较不等于给定元素的元素都移到容器的开头。
- 所以,实际上不要删除匹配的元素。
它只是将不匹配的内容转移到开始并将迭代器提供给新的有效结束。
它只需要 O(n) 复杂度。
删除算法的输出是:
10 20 30 50 40 50
因为 remove 的返回类型是迭代到该范围的新结尾。
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
现在使用向量的擦除功能从向量的新端到旧端删除元素。它需要 O(1) 时间。
v.erase ( std :: remove (v.begin() , v.end() , element ) , v.end () );
所以这个方法在 O(n) 中工作