注册 登录
编程论坛 C++教室

vector 的erase问题

happynight 发布于 2010-04-26 11:24, 1091 次点击
学习erase的erase(b,e)操作时
突发奇想若b,e的位置不是按照标准的b前e后而是按照e前b后调用呢
代码如下
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);
    vector<int>::iterator iter1,iter2=vec.begin();
    iter1=iter2+3;
    cout<<vec.begin()<<endl;
    vec.erase(iter1,iter2);     
    cout<<vec.begin()<<endl;
    vector<int>::iterator iterTmp=vec.begin();
    while(iterTmp!=vec.end())
    {
        cout<<*iterTmp<<endl;
        ++iterTmp;
    }
   
查看了下erase的原代码
      iterator erase(iterator _F, iterator _L)
        {iterator _S = copy(_L, end(), _F);
        _Destroy(_S, end());
        _Last = _S;
        return (_F); }
实际上就是将后一个跌代器到end()之间的数据Copy到前面后回收掉多余的空闲内存
查看了下begin()的结果在erase前后都无变化,按照理解应该进行的操作是
操作前:1 2 3 4 5
       ↑         ↑
       begin()    end()
操作后:1 2 3 1 2 3 4 5
       ↑              ↑
       begin()         end()
但查看begin到end之间的结果仍然是1、2、3、4、5 不知道是为什么
        




[ 本帖最后由 happynight 于 2010-4-27 08:06 编辑 ]
6 回复
#2
happynight2010-04-26 14:06
无人关注吗
#3
boyhailong2010-04-26 16:16
因为earse是删除二者之间的元素,而iter1,iter2之间没有元素,所以无法删除,
#4
boyhailong2010-04-26 16:21
哦,貌似我说错了,vec.erase(iter1,iter2);  这句是要删除iter1和iter1之间的元素,当然是0个元素,删除失败!!
#5
happynight2010-04-27 08:09
以下是引用boyhailong在2010-4-26 16:21:14的发言:

哦,貌似我说错了,vec.erase(iter1,iter2);  这句是要删除iter1和iter1之间的元素,当然是0个元素,删除失败!!
这个我知道 关键是按照理解 删除后的结果是什么样 我理解的和真实的删除后的结果有出入
另外 你没看明白我的问题
#6
yuyunliuhen2010-04-27 13:51
#7
happynight2010-04-27 14:00
SORRY 结果就是我想象的那样 是我自己绕进去了 另外 在此情况下 使用erase的话 嘿嘿 有兴趣的可以试下
1