首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

《小弟我的第一本C++书》节选:10.5.1 “算法”老师带来的一堂别开生面的体育课

2014-01-05 
《我的第一本C++书》节选:10.5.1 “算法”老师带来的一堂别开生面的体育课今天晴空万里,几片云彩飘在蔚蓝的天

《我的第一本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()算法将自己改头换面扮演成其他人,。这真是一堂别开生面的体育课。

热点排行