vector erase使用

vector erase原型

// erase的函数原型有两种形式
iterator erase(iterator p);  // 删除某个迭代器p所指元素元素,返回被删元素之后元素迭代器。当p=end,函数行为无定义。
iterator erase(iterator b, iterator e); // 或者迭代器范围[b, e)的元素

在使用中需要注意到删除元素后迭代器的数量和位置的变化;

在进行多值删除时,如果是按值匹配删除,应将迭代器更新放在循环内部,如果是按下标删除,则应从后向前删除,避免段错误。

删除普通元素

// 按值匹配删除,迭代器更新放在循环体内,而不是for循环条件语句中
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )  
{  
     if(*iter == 3)
     {
         iter = veci.erase(iter);
     }     
      else
      {
          iter++;
      }         
}

// 按下标删除多个元素,从后向前,避免段错误
// value_vec 元素向量
// idx_vec  待删除元素索引向量,按升序排列
for(int i = idx_vec.size()-1; i >= 0; i--)
{
    value_vec.erase(value_vec.begin() + idx_vec[i]);
}

删除指针元素

当vector存储的是对象的指针时,此时vector用erase删除元素时,那么元素本身在该vector种会被删除,但对象本身没有被实际删除…

因此,针对这种情况new处理的对象,如果想把指针对应的对象实例也删除,需要先遍历删除对象实例后,再删除指针元素。

// std::vector中存放的元素为new出来的对象指针 Furniture* furniture = new Furniture();
// 删除实现功能,按待删除的元素索引列表(升序排列),删除vector中的指针元素,以及所对应的实例。
void removeFurniturebyIdxVec(const std::vector<int> furnitures_idx)
{
    std::vector<Furniture*>::iterator iter;
    for(int j = 0; j < furnitures_idx.size(); j++)
    {
        iter = this->furnitures.begin() + furnitures_idx[j];
        delete (*iter);
        (*iter) = nullptr;
    }

    for(int j = furnitures_idx.size()-1; j >=0; j--)
    {
        this->furnitures.erase(this->furnitures.begin() + furnitures_idx[j]);
    }
}

参考:C++ 删除vector中存放的指针

remove与erase混合使用

// remove的函数原型
// remove函数会将范围内值等于val的元素用后一个元素替代,返回新的end()迭代器,但是不改变原来数组的end()迭代器的值
iterator remove(iterator first, iterator last,val); // 返回值为新的end()迭代器

// 通常和erase()函数混合使用
// remove()函数的功能就是将vector中存在的指定数据移动到vector末尾,注意,虽说remove将元素移动到末尾,但是在vector中并不显示出来,也就是说不能输出,但是内存中却存在这个数,是有使用了erase才能彻底删除;
vec.erase(remove(vec.begin(), vec.end(), val),vec.end());
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值