C++ 的erase和remove remove_if删除元素

1. erase

  很多时候,我在删除vector元素的时候使用的是遍历指针,符合条件时使用erase删除,

可是这样的使用办法会有个问题,在vec.erase(iter)后,需要使用erase的返回值,并且这个返回值是等价iter++,也就是iter的下一个元素,

否则的话,iter将会是个无效指针

    vector<int> vec_int = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };for (vector<int>::iterator iter = vec_int.begin(); iter != vec_int.end();) {
        if (*iter == 6){
            iter = vec_int.erase(iter);
        }
        else{
            ++iter;
        }
    }
    for (auto& i : vec_int)
    {
        printf("i = %d\n", i);
    }

  可是从MSDN中看到erase并不是这么用的

   vector <int> v1;
   vector <int>::iterator Iter;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );
   v1.push_back( 40 );
   v1.push_back( 50 );

   cout << "v1 =" ;
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;

output:

v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50

  MSDN中给出的用法是直接删除某一个或者一段的元素

 

2.remove和remove_if

  实际使用中,删除指定元素更为准确的用法应该是使用remove和remove_if。

  bool isOdd(int value)
  {
    return (value % 2) == 1;
  }

  vector<int> vec_int = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    vec_int.erase(remove_if(vec_int.begin(), vec_int.end(), isOdd), vec_int.end());

    for (auto& i : vec_int)    {
        printf("i = %d\n", i);
    }
    vec_int.erase(remove(vec_int.begin(), vec_int.end(), 8));

    for (auto& i : vec_int)    {
        printf("i = %d\n", i);
    }

    for (vector<int>::iterator iter = vec_int.begin(); iter != vec_int.end();) {
        if (*iter == 6){
            iter = vec_int.erase(iter);
        }
        else{
            ++iter;
        }
    }

    for (auto& i : vec_int)    {
        printf("i = %d\n", i);
    }
output:
i = 0 i = 2 i = 4 i = 6 i = 8 i = 0 i = 2 i = 4 i = 6 i = 0 i = 2 i = 4

 

 

不同容器的迭代器的功能
容器迭代器功能
vector 随机访问
deque 随机访问
list 双向
set / multiset 双向
map / multimap 双向
stack 不支持迭代器
queue 不支持迭代器
priority_queue 不支持迭代器
posted @ 2020-07-03 10:23  GongKiro  阅读(976)  评论(0编辑  收藏  举报