STL中remove()函数实现的原理

函数功能:

将范围 [first,last) 转换为一个范围,其中删除了所有与 val 相等的元素,并返回一个迭代器指向该范围的新的末尾端。

实现逻辑:
该函数不能改变STL容器的大小:删除是通过用下一个不等于 val 的元素替换与 val 相等的元素来完成的,并通过返回指向新末尾端后的第一个元素的迭代器来指示缩短范围的新大小。

未删除的元素的相对顺序将保留,而返回的迭代器和最后一个迭代器之间的元素将保留在有效但未指定的状态。

要想彻底删除 需要使用erase函数来清除返回的迭代器和最后一个迭代器之间的元素:

erase(newEnd,numIntVec.end());

换句话说就是, remove通过将后面不等于指定值val的元素向前移动覆盖到等于val的元素,从而完成元素的删除,但是这样的操作没有释放掉多余的空间,所以需要用erase来释放

该函数使用 operator== 将各个元素与 val 进行比较,当类或结构作为容器元素时,需要重载运算符 ==。

STL中的源码

template <class ForwardIterator, class T>
  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!(*first == val)) {
      *result = move(*first);
      ++result;
    }
    ++first;
  }
  return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值