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;
else
cout<<"没有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;
}
else
break;
}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函数