《我的第一本C++书》节选:10.5.1 “算法”老师带来的一堂别开生面的体育课
今天晴空万里,几片云彩飘在蔚蓝的天空……(此处省掉了描写C++世界如何风光秀丽,STL如何英明神武,上下形式一片大好的文字1983字)今天上课的是一位从STL中请来的新老师,他有个奇怪的名字:算法。这位“算法”老师给大家上了一堂别开生面的体育课。 这些学生实际上都是Student类的对象,这些学生都有自己的属性和方法。例如,都有自己的名字和身高,当然,也会报告自己的名字和身高。
// 学生类,描述属性和行为
class Student
{
public:
// 默认构造函数
Student()
{
m_nHeight = 0;
m_strName = "";
};
// 接受姓名和身高作为参数的构造函数,
// 可以设定对象的姓名和身高
Student( string strName, int nHeight )
: m_strName(strName), m_nHeight(nHeight) {};
// 对象的行为
public:
// 获得身高
int GetHeight()
{
return m_nHeight;
}
// 向屏幕输出,报告名字和身高
void ReportName()
{
cout<<"姓名:"<<m_strName<<"\t身高:"<<endl;
}
// 对象的属性
private:
string m_strName = ""; // 姓名
int m_nHeight = 0; // 身高
};
可怜得很,我们班只有三个同学,他们分别是:
// 我和我的同学们
Student st1("ChenLiangqiao", 173);
Student st2("Jiawei", 163);
Student st3("Jiajunpeng", 187);
上课铃响了,要开始上课了,老师把我们召集起来放到一个vector容器中:。
// 老师用push_back()函数将我们召集到vector容器中
vector<Student> vecStu;
vecStu.push_back( st1 );
vecStu.push_back( st2 );
vecStu.push_back( st3 );
正当我们要开始上课的时候,这时隔壁班级的同学看到这边上课有趣,也想要过来加入。他们已经集合到另外一个容器vecStuC2中了,于是“算法”老师利用copy_backward()算法将他们合并到我们所在的vecStu容器中:。
// 扩大我们所在容器的容量,为新来的同学腾出点地方
vecStu.resize( vecStu.size() + vecStuC2.size() );
// 将新同学对象复制到我们的容器中,欢迎新同学
copy_backward( vecStuC2.begin(), vecStuC2.end(), vecStu.end());
好了,这下人到齐了,老师一声哨响开始上课了:“全体同学都到了,立正,向右看齐,高个儿的站左边,低个儿的站右边。”这是老师让我们按照身高排队,老师还为我们提供了一个排队的规则:高个儿的站左边,低个儿的站右边。
// 排队的规则:高个儿的站左边,低个儿的站右边高个儿的站左边,低个儿的站右边
bool sortbyHeight(Student st1, Student st2 )
{
// 两两之间比较一下身高
return st1.GetHeight() < st2.GetHeight();
}
排队的规则有了,那就赶快用sort()算法按照这个规则排好队伍吧:。
// 按照老师的排队规则排好队伍
sort(vecStu.begin(), vecStu.end(), sortbyHeight);
使用sort()算法排队真是又快又好,只用了0.02秒,原来乱哄哄的队伍一下就按照身高排好了顺序。老师看我们已经排好了队,于是又开始下达命令:“开始报数。”一个for_each()算法,让我们每个人都动了起来,各自调用自己的ReportName()成员函数,报出了自己的姓名和身高:。
// 让容器中的每个对象都调用自己的ReportName()函数,
// 报出自己的姓名和身高
// 这里算法老师使用mem_fun_ref()函数将类的成员函数地址
// 构造成函数对象供我们执行
for_each( vecStu.begin(), vecStu.end(),
mem_fun_ref(&Student::ReportName));
“算法”老师只用了几个简单的算法就把这群Student对象弄得服服帖帖,我们都很佩服它他。后来又玩了捉迷藏——用find_if()算法找到躲起来的人——用transform()算法将自己改头换面扮演成其他人,。这真是一堂别开生面的体育课。