STL中remove_if()/find_if()/replace_if()的使用方法(The usages of remove_if()/find_if()/replace_if() )

In one of my c++ homework, my teacher let us use some algorithms in STL  to operate the student's information.To finish the task, I needed learn to use  the algorithms of  remove_if(),find_if,replace_if.At first,it was hard for me,but after searching some information on the internet  and reading the book carefully,I overcame  them at last.

Now I write  the usages of them here,hope can help you!

C++  STL  Algorithm  find_if   remove_if  replace_if

find_if()的使用方法

iter=find_if(first,last,pr);

函数说明:故名思议就是“查找...如果....”,这个函数的功能就是查找满足条件的元素

参数说明:这里first、last是两个迭代器,限定了查找的范围,pr为函数对象(函数名称)

返回说明:算法执行后返回指向序列中第一个使函数对象pr返回ture的元素的迭代器。

即返回一个元素的地址;该元素是查找元素范围内第一个能使pr函数返回ture的元素。

2 remove_if()的使用方法

iter=remove_if(first,last,del);

函数说明:顾名思义:删除 如果。函数功能就是删除满足条件的元素

参数说明:这里的first、last同样是两个迭代器,同样限定了查找的范围,del也是函数对象

返回说明:算法执行后同样返回一个元素的迭代器,不过这个元素是这一序列元素中删除后留下的最后一个元素(详细见参考实例)。

3 replace_if()的使用方法

replace_if(first,last,pr,val);

函数说明:替换所有满足条件的的元素的值、对象为另一个特定的值、对象。

参数说明:first、last两个限定查找范围的迭代器,pr函数对象,val指定的替换对象、值。

 

实例展示:现在有一个班的同学信息,用以上函数完成一下操作。

1 查找特定学生的成绩(the usage of find_if())

2 删除成绩在60分一下的学生信息(the usage of remove_if())

3 替换(修改)某一学生的信息(the usage of replace_if())

  

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
string name1,name2;
//定义一个学生类
class student
{
public:
	student(string na,string nu,int ma)
	{
		name=na;
		number=nu;
		mark=ma;
	}
	//声明三个友元函数  三个函数分别应用于replace_if、remove_if、find_if
	friend bool re(const student & m);
	friend bool del(const student & m);
	friend bool Find(const student & m);
	string getname() 
	{return name;}
	string getnumber() 
	{return number;}
	int getmark() 
	{return mark;}
private:
	string name,number;
	int mark;
};

bool re(const student & m)
{
	
	if(m.name==name2)
		return true;
	else
		return false;
}

bool del(const student & m)
{

	if(m.mark<60)
		return true;
	else
		return false;
}

bool Find(const student & m)
{
	
	
	if(m.name==name1)
		return true;
	else
		return false;
}
	
int main()
{
	int i;
	vector<student>vect;
	vector<student>::iterator iter;
	vector<student>::iterator start;

      // 增加四个学生信息    并依此放进容器中
	student s1("Li ming","001",59),s2("Han mei","002",90),s3("Jim","003",89),s4("Lucy","004",95);
	vect.push_back(s1);vect.push_back(s2);vect.push_back(s3);vect.push_back(s4);

	   //  输出所有学生的信息
	cout<<"The original information of the students:"<<endl;
	for(i=0;i<vect.size();i++)
		cout<<"name: "<<vect[i].getname()<<"  number: "<<vect[i].getnumber()<<"  mark: "<<vect[i].getmark()<<endl;
	cout<<endl<<endl;

	 //  查找特定学生操作 输入要查找的学生名字  显示该学生信息
	 cout<<"Please input the name of the student who you are want to find:"<<endl;
	 cin>>name1; 
	 cout<<"The information of the student you want to find is:"<<endl;
     iter=find_if(vect.begin(),vect.end(),Find);
	 cout<<"name : "<<iter->getname()<<"   number:"<<iter->getnumber()<<"   mark:"<<iter->getmark();
     cout<<endl<<endl;
       
    //输入特定学生的名字,并把他的信息用s5的信息替换
    student s5("zhan hua","001",59);
	cout<<"Please input the studnet's name you want update his/her information:"<<endl;
    cin>>name2;
	replace_if(vect.begin(),vect.end(),re,s5);
    for(start=vect.begin();start!=vect.end();start++)
		cout<<"name: "<<start->getname()<<"  number: "<<start->getnumber()<<"  mark: "<<start->getmark()<<endl;
	cout<<endl<<endl;

	// 删除特定条件下的学生成绩 (删除60分以下的学生信息)
	cout<<"The information of the students who's mark is more than 60 or equal to 60:"<<endl;
    iter=remove_if(vect.begin(),vect.end(),del);
    for(start=vect.begin();start!=iter;start++)
		cout<<"name: "<<start->getname()<<"  number: "<<start->getnumber()<<"  mark: "<<start->getmark()<<endl;
	cout<<endl<<endl;
    return 0;
}


  运行结果:

 

If there are something wrong,please point out,thank you very much!

参考资料:[c plus plus].

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值