📅  最后修改于: 2020-09-07 06:42:46             🧑  作者: Mango
假设我们有一个整数向量,并且想要从中删除所有出现的数字,即假设向量包含以下数字1,2,5,4,5,1,5,7,8,9。现在我们要从中删除所有出现的5,以便vector内容应变为1 2 4 1 7 8 9。
1.)遍历vector中的所有元素,并检查每个元素是否与所需编号匹配;
2.)如果匹配,则删除该元素并继续。
std::vector::iterator it = vec.begin();
while(it != vec.end())
{
if(*it == elem)
{
it = vec.erase(it);
}
else
it++;
}
此方法效率不高。由于擦除功能会删除元素并将所有元素右移1,因此,复杂度为O(n ^ 2)
std :: remove将给定范围转换为一个范围,所有比较不等于给定元素的元素都移到了容器的开头。因此,实际上其并没有删除匹配的元素。
它只是将未匹配的元素移动到容器的开始位置,并更新迭代器。在配合Erase函数,即可高效的删除元素。
vec.erase(std::remove(vec.begin(), vec.end(), elem), vec.end());
完整的代码如下:
#include
#include
#include
#include
void removeAllMatchingElements_nonEfficient(std::vector & vec, int elem)
{
std::vector::iterator it = vec.begin();
while(it != vec.end())
{
if(*it == elem)
{
it = vec.erase(it);
}
else
it++;
}
}
void removeAllMatchingElements_Efficient(std::vector & vec, int elem)
{
vec.erase(std::remove(vec.begin(), vec.end(), elem), vec.end());
}
void displayVector(std::vector & vec)
{
std::vector::iterator it = vec.begin();
while(it != vec.end())
std::cout<<(*it++)<<" ";
std::cout< vec(arr , arr + 10);
removeAllMatchingElements_nonEfficient(vec, 5);
displayVector(vec);
std::vector vec2(arr , arr + 10);
removeAllMatchingElements_Efficient(vec2, 5);
displayVector(vec2);
return 0;
}