C++STL实验之综合练习

实验目的:

1.掌握仿函数的基本操作

2.熟练使用基本非变算法

实验器材:

C++

实验内容:

建立小型学生成绩管理系统,实现不同成绩的查询

实验步骤:

#include<iostream>

#include<set>

#include<functional>

#include<iterator>

#include<algorithm>

using namespace std;

class Stu

{

    string name;

    int sno;

public:

    Stu(string n,int s){name=n;sno=s;}

    void show(){cout<<name<<" "<<sno<<endl;}

    bool operator>(Stu s)const

    {

        return sno>s.sno;

    }

    int get(){return sno;}

    friend ostream &operator<<(ostream &out,Stu s)//流要加引用

    {

        out<<s.name<<" "<<s.sno;

        return out;

    }

};

class Comp

{

public:

    bool operator()(Stu s1,Stu s2)

    {

        s1.get()>s2.get();

    }

};

class print

{

public:

    void operator()(Stu s){s.show();}

};

int main()

{

    Stu s[]={Stu("ss",20),Stu("gg",23)};

//规则:学号从大到小

//1.greater+重载(const)

    set<Stu,greater<Stu>> v(s,s+2);

//2.自定义仿函数类

    set<Stu,Comp> v2(s,s+2);

/**输出数据

1、for循环+迭代器-->(*i).show()

2、copy+重载<<(只能用友元)

3、for_each+函数对象

**/

    copy(v.begin(),v.end(),ostream_iterator<Stu>(cout,","));//4,5,6

    cout<<endl;

    for_each(v.begin(),v.end(),print());//print函数对象

    return 0;

}

实验结果(附数据和图表):

实验结果分析及结论:

实验成功,成功的初始化set容器并且用copy和for_each+函数对象,完成了输出。

在输出中,重载<<,>,()完成了学号和姓名的输出。

实验心得体会和建议:

函数对象是重载operator()的类的一个实例。

函数对象的分类

• 发生器:

  没有输入参数,但有返回一个数据类型的函数对象,如:rand

• 一元函数

  T1 = F(T)

• 二元函数

  T2 = F(T, T1)

• 一元判定函数

  bool = F(T)

• 二元判定函数

  bool = F(T, T1)

在我的实验中,通过定义比较规则的函数对象,我成功地在set容器中实现了学生信息的排序。这种灵活性使得函数对象成为处理各种复杂逻辑和排序要求的理想选择。

    关于函数对象的分类,了解不同类型的函数对象有助于更好地选择和设计适用于特定场景的函数对象。发生器函数对象,如 rand,用于生成数据,一元函数对象和二元函数对象分别处理一个和两个输入参数的情况,而一元判定函数对象和二元判定函数对象则用于条件判断。这种分类体现了函数对象在不同编程任务中的多样性和适用性。

                                     

实验评价及结论:

实验指导老师签字:                                      年   月  日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LucianaiB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值