C++ : Vector删除所有指定的元素


假设我们有一个整数向量,并且想要从中删除所有出现的数字,即假设向量包含以下数字1,2,5,4,5,1,5,7,8,9。现在我们要从中删除所有出现的5,以便vector内容应变为1 2 4 1 7 8 9。

示例1:

1.)遍历vector中的所有元素,并检查每个元素是否与所需编号匹配;
2.)如果匹配,则删除该元素并继续。

std::vector<int>::iterator it = vec.begin();
    while(it != vec.end())
    {
        if(*it == elem)
        {
            it = vec.erase(it);
        }
        else
            it++;
    }

此方法效率不高。由于擦除功能会删除元素并将所有元素右移1,因此,复杂度为O(n ^ 2)

示例2:Erase-Remove

std :: remove将给定范围转换为一个范围,所有比较不等于给定元素的元素都移到了容器的开头。因此,实际上其并没有删除匹配的元素。
它只是将未匹配的元素移动到容器的开始位置,并更新迭代器。在配合Erase函数,即可高效的删除元素。

 vec.erase(std::remove(vec.begin(), vec.end(), elem), vec.end());

完整的代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
void removeAllMatchingElements_nonEfficient(std::vector<int> & vec, int elem)
{
   std::vector<int>::iterator it = vec.begin();
   while(it != vec.end())
   {
     if(*it == elem)
     {
        it = vec.erase(it);
     }
     else
        it++;
  }
}
void removeAllMatchingElements_Efficient(std::vector<int> & vec, int elem)
{
    vec.erase(std::remove(vec.begin(), vec.end(), elem), vec.end());
}
void displayVector(std::vector<int> & vec)
{
   std::vector<int>::iterator it = vec.begin();
   while(it != vec.end())
       std::cout<<(*it++)<<" ";
   std::cout<<std::endl;
}
int main()
{
   int arr[10] = {1,2,5,4,5,1,5,7,8,9};
   std::vector<int> vec(arr , arr + 10);
   removeAllMatchingElements_nonEfficient(vec, 5);
   displayVector(vec);
   std::vector<int> vec2(arr , arr + 10);
   removeAllMatchingElements_Efficient(vec2, 5);
   displayVector(vec2);
   return 0;
}

Made with ❤️ in Chengdu. Copyright reserved 2019-2022.

蜀ICP备20006366号-1