zoukankan      html  css  js  c++  java
  • Vector的使用笔记(2)——Iterator

    iterator

    1.erase

    //删除一个元素
    iterator erase(const_iterator pos);
    //删除一组元素, 范围 [first, last), 半闭半开区间
    iterator erase(const_iterator first, const_iterator last);
    两种情况都有返回值,返回最后被删除元素的后面一个的iterator.

    一个简单的测试

    vector<int> ak(6);
    unsigned
    int i = 0;
    for(i=0;i<ak.size();i++){
    ak[i]
    = i;
    }

    for(i=0;i<ak.size();i++){
    cout
    << ak[i] << " ";
    }
    cout
    << endl;

    vector
    <int>::iterator it = ak.end();
    for(it=ak.begin();it!=ak.end();){
    cout
    << (*it) << " ";
    it
    ++;
    }
    cout
    << endl;

    for(it=ak.begin();it!=ak.end();){
    cout
    << (*it) << " ";
    if((*it)>2 && (*it)<4)
    ak.erase(it);
    it
    ++;
    }
    cout
    << endl;

    for(i=0;i<ak.size();i++){
    cout
    << ak[i] << " ";
    }
    cout
    << endl;

    输出结果却不是我希望的那样,

    traverse by [] operator:
    0 1 2 3 4 5
    size:
    6 capacity: 6
    traverse by iterator:
    0 1 2 3 4 5
    traverse and erase:
    0 1 2 4 5
    after erase:
    0 1 3 4 5
    size:
    5 capacity: 6

    可以看到,在删除元素的遍历过程中,没有输出3,而且在最后的输出中,有3这个元素,也就是说,3没有被删除。

    This is interesting!

    erase将it所在位置删除,并将后面的元素移到前面来,那么在删除2之后,it对应位置成为3,而此时it++,导致被移上来的3没有遍历到,才导致最后3没有被删除。

    所以应该改一下,

    if((*it)>2 && (*it)<4)
    ak.erase(it);
    else
    it
    ++;
    在不删除元素时,it++,这样才可以正常工作。
  • 相关阅读:
    4.26上午
    4.25下午
    4.19上午
    4.18上午
    7.26
    7.25
    7.21-7.22
    7.22
    7.21
    7.11-7.15
  • 原文地址:https://www.cnblogs.com/Frandy/p/Vector_Erase.html
Copyright © 2011-2022 走看看