在使用remove_if时发现此函数无法对容器内满足pred表达式的数据删除,remove_if将会使用列表内其他数据填充,而本身的大小不变,具体解释可以参考remove_if的用法,这种情况下需要搭配erase方法彻底删除.

1
2
bool IsMoreThen(LinkList target){return target.count>=5;}
list.erase(std::remove_if(list.begin(), list.end(), IsMoreThen));

原因
remove_if方法是找出符合条件的元素,并使用erase删除返回的vector<_type_>::iterator 的值,并将元素跳转向下一个元素,此时由于元素指针自动跳转+1,会造成连续值删除出现漏删的情况,针对这种情况需要写一个方法重新计算即可。

1
2
3
4
5
6
7
8
9
10
11
std::vector<LinkList> RemovePredList(std::vector<LinkList> lists){
std::vector<LinkList>::iterator iter = lists.begin();
while (iter!=lists.end()){
if(iter->count>=5)
iter = lists.erase(iter);
else
iter++;
}
return lists;
}