`std::remove`和std::remove_if 是 C++11 标准库中的一个算法函数.
std::remove
作用
遍历一遍容器,将容器中所有不是指定元素的元素往前复制。
总之就是一句话:
把不该删除的移动到前面,后面的就是应该删除的。
注意:
1,不会将指定元素往后移,而是直接删除目标元素。
2,删除后容器的容量不变。
#include <iostream>
#include <algorithm>int main(){std::string str="a,b,c,d,e,f";auto iter=std::remove(str.begin(),str.end(),',');std::cout<<str<<std::endl;return 0;
}
输出:
#include <iostream>
#include <algorithm>int main(){std::string str="abcdef";auto iter=std::remove(str.begin(),str.end(),'a');std::cout<<str<<std::endl;return 0;
}
返回值
返回最后一个元素移动的新位置的下一个元素位置的迭代器。
作用:
删除容器中的所有指定元素。
#include <iostream>
#include <algorithm>int main(){std::string str="a,b,c,d,e,f,";auto iter=std::remove(str.begin(),str.end(),',');str.erase(iter,str.end());std::cout<<str<<std::endl;return 0;
}
#include <iostream>
#include <algorithm>
#include <vector>int main(){std::vector<int> vec{1,2,3,4,1,1,1,1,5};auto iter=std::remove(vec.begin(),vec.end(),1);for(int v:vec) std::cout<<v<<" ";std::cout<<std::endl;vec.erase(iter,vec.end());for(int v:vec) std::cout<<v<<" ";std::cout<<std::endl;return 0;
}
std::remove_if
作用
std::remove只能对单个数据操作,remove_if可以利用函数对象进行条件设置。
#include <iostream>
#include <algorithm>
#include <vector>int main(){std::vector<int> vec{1,2,3,4,5,6,7,8,9,10};std::remove_if(vec.begin(),vec.end(),[](int v){return v%2==0;});for(int v:vec) std::cout<<v<<" ";std::cout<<std::endl;return 0;
}
删除不满足条件的元素---返回值
#include <iostream>
#include <algorithm>
#include <vector>int main(){std::vector<int> vec{1,2,3,4,5,6,7,8,9,10};auto iter=std::remove_if(vec.begin(),vec.end(),[](int v){return v%2==0;});vec.erase(iter,vec.end());for(int v:vec) std::cout<<v<<" ";std::cout<<std::endl;return 0;
}