进阶篇_STL中通用算法处理数据

来源:互联网 发布:奇商网络 编辑:程序博客网 时间:2024/06/06 09:50

1. for_each()算法遍历容器元素

形象地讲,for_each()算法像一个漏斗装置,用具体的处理方法来做漏斗的漏纸,把容器中指定的元素遍历倒入漏斗,将符合处理方法的容器元素进行处理

void addsalary(int& nsalary)//员工工资低于2000的涨30% {if(nsalary < 2000){nsalary *= 1.3;}}vector<int> vecsalary;vecsalary.push_back(3200);vecsalary.push_back(1983);vecsalary.push_back(703);for_each(vecsalary.begin(), vecsalary.end(), addsalary); //使用for_each算法对容器中指定范围的数据进行遍历处理,处理方法为addsalary 

2. 用find()和find_if()算法实现线性查找

如果找到,返回指向这个元素的迭代器,否则返回这个容器的末尾位置

find():

vector<string> vecgoods; //商品信息的容器 vecgoods.push_back("eraser");vecgoods.push_back("pencil");vecgoods.push_back("pen");string str = "ruler" //定义要购买的商品,老板进行查找vector<string>::iterator it = vecgoods.find(vecgoods.begin(), vecgoods.end(), str); //find()函数 if(it != vecgoods.end())cout<<*it<<endl;elsecout<<"没有ruler商品"<<endl;
find_if(),有时候并不一定想找某个特定的数据而是能够找到符合某种条件的数据:

bool ispass(int n)//用函数定义查找规则 {return n>=60;}vector<int> vecscores;vecscores.push_back(72);vecscores.push_back(54);vecscores.push_back(87);vector<int>::iterator it = vecscores.begin();//定义查找的起始位置 do//利用循环,逐个查找容器中符合条件的数据 {it = find_if(it, vecscores.end(), ispass);//find_if()来查找符合条件的数据,返回指向条件为true的迭代器或者容器末尾 if(it != vecscores.end()){cout<<"找到及格分数:"<<(*it)<<endl;++it;}elsebreak;}while(true);

3. remove()和replace()算法:

bool isfail(int n)//用函数定义查找规则 {return n<60;}vector<int> vecscores;vecscores.push_back(72);vecscores.push_back(54); //不及格 vecscores.push_back(87);vecscores.push_back(-1); //缺考 remove(vecscores.begin(), vecscores.end(), -1); //删除所有缺考的成绩replace(vecscores.begin(), vecscores.end(), isfail, 60); //将所有不及格的成绩替换为60 

4. 容器元素的复制与变换:copy()算法和merge()算法

copy():将一个容器的元素复制到另外一个容器中去。三个参数:源容器的起始与终止位置,目标容器的起始位置

//三个参数:源容器的起始与终止位置,目标容器的起始位置//正向复制copy(),从目标起始位置向后放置数据vector<int> vecscoreC1; vector<int> vecscoreC2; //保存C1、C2班级成绩的两个容器 vector<int> vecscore; //保存所有成绩的总容器vecscore.resize() = vecscoreC1.size() + vecscoreC2.size(); //重新设定总容器的容量vector<int>::iterator lastit = copy(vecscoreC1.begin(), vecscoreC1.end(), vecscore.begin());    //将C1容器的数据复制到总容器中 copy(vecscoreC2.begin(), vecscoreC2.end(), lastit);//将C2容器的数据追加到vectorscore的末尾lastit

//逆向复制copy_backward(),从目标起始位置向前放置数据

merge():除了使用copy()烦琐地逐个复制元素实现两个容器的合并之外,STL提供merge()专门用来讲两个源容器的数据合并到目标容器的算法。在使用merge()算法进行合并之前,必须使用sort()算法对两个源容器中的数据进行排序

vector<int> vecscoreC1; vector<int> vecscoreC2; //保存C1、C2班级成绩的两个容器 vector<int> vecscore; //保存所有成绩的总容器sort(vecscoreC1.begin(), vecscoreC1.end());sort(vecscoreC2.begin(), vecscoreC2.end()); //sort()排序先vecscore.resize() = vecscoreC1.size() + vecscoreC2.size(); //重新设定总容器的容量merge(vecscoreC1.begin(), vecscoreC1.end(), vecscoreC2.begin(), vecscoreC2.end(), vecscore.begin());

5. set_union算法:合并两个源容器,相同数据只保留一份

//set_union()实现数据元素的不重复,只能出现一次的将源容器数据合并到目标容器中,当然使用前同样要sort()排序 vector<string> vecgoods; //总商品清单vector<string> vecstation; //文具类清单vector<string> vecoffice;  //办公类清单vecstation.push_back("pen");vecstation.push_back("pencil");vecoffice.push_back("folder");vecoffice.push_back("pen");vecgoods.resize(vecstation.size() + vecoffice.size());sort(vecstation.begin(), vecstation.end());sort(vecoffice.begin(), vecoffice.end());//set_union()算法返回的是指向合并后的目标容器中最后一个数据的迭代器 vector<string>::iterator itend = set_union( vecstation.begin(), vecstation.end(), vecoffice.begin(), vecoffice.end(), vecgoods.begin() );for(auto it = vecgoods.begin(); it!=itend; ++it)cout<<*it<<endl;//输出合并后的商品 

6. 变换容器元素:transform函数




0 0
原创粉丝点击