• 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++,这样才可以正常工作。
  • 相关阅读:
    使用Razor模板构建应用注意的细节
    分享一个秒计数器
    有效提高命中率的缓存设计
    伟大的C语言
    关于在使用Visual C++中使用MMX、SSE指令集的问题
    如何用SVN 或 WINCVS 下载x264 ffdshow T264 Kevinlib
    Visual C++图形特技
    图象处理部分文章列表
    C++,VC资源
    Visual C++ 如何:在各种字符串类型之间进行转换
  • 原文地址:https://www.cnblogs.com/Frandy/p/Vector_Erase.html
Copyright © 2020-2023  润新知