remove 和 erase
remove 和 erase
1. 说明
remove是独立于类型的函数
erase在各个容器中有对应实现
remove只能把 所有待删除的元素进行移动,但是不能更改实际大小(也没法更改,他无法知道是什么容器以及容器内部legnth也无法更改),返回一个指向待删除元素的迭代器
erase指定一个迭代器,然后删除这个迭代器,返回下一个迭代器的值
2. 一般就配合使用
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
vector<int> test{1,2};
test.erase(remove(a.begin(), a.end(), 1), a.end());
return 0;
}
咋说呢,你没有remove也能实现删除,但是有了remove这些函数代码就会很简洁
3. 多说一句erase
使用erase会造成参数的迭代器失效,所以每次调用后,参数的迭代器应该赋值
推荐 iterator = erase(iterator)
3. 本质
template<typename _ForwardIterator, typename _Tp>
_ForwardIterator
remove(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{
// concept requirements
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator>)
__glibcxx_function_requires(_EqualOpConcept<
typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
__glibcxx_requires_valid_range(__first, __last);
__first = _GLIBCXX_STD_A::find(__first, __last, __value);
if(__first == __last)
return __first;
_ForwardIterator __result = __first;
++__first;
for(; __first != __last; ++__first)
if(!(*__first == __value))
{
*__result = _GLIBCXX_MOVE(*__first);
++__result;
}
return __result;
}
注意看
++__first;
for(; __first != __last; ++__first)
if(!(*__first == __value))
{
*__result = _GLIBCXX_MOVE(*__first);
++__result;
}
就是把元素找到,然后进行移动构造,这样就把后面所有的非删除元素移动到前面,这样不停执行移动,最终返回 第一个待删除元素
内部依赖了find找到第一个待删除元素
4. remove_if 是干啥的
相对于remove,remove_if让你可以指定一个条件参数
remove_if(beg, end, op) //移除区间[beg,end)中每一个“令判断式:op(elem)获得true”的元素;
#include <iostream>
#include <vector>
#include <algorithm>
bool IsSpace(int x) { return x == 3 || x == 4; }
int main()
{
vector<int> test{1, 2, 3, 4, 5};
test.erase(remove_if(test.begin(), test.end(), IsSpace), test.end());
for( auto&& p : test ) {
std::cout << p << std::endl;
}
return 0;
}
一个圆,圆内是你会的,圆外是你不知道的。而当圆越大,你知道的越多,不知道的也越多了