函数功能:
将范围 [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;
}