`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;
}